Раскадровка переход от контроллера вида к себе


Я пытаюсь создать механизм для детализации списка файлов / папок. Идея состоит в том, чтобы показывать один и тот же контроллер представления списка файлов каждый раз, когда пользователь выбирает папку, и показывать контроллер представления сведений о файле, если он/она выбирает файл.

до сих пор я создал сегмент из контроллера представления списка файлов в контроллер представления сведений о файле и сегмент из ячейки представления таблицы списка файлов в представление таблицы списка файлов контроллер:

проблема в том, что как только пользователь нажимает на ячейку, переход выполняется. Я хотел бы удалить segue из ячейки табличного представления и сделать один из контроллера списка файлов для себя. Таким образом, я мог бы вызвать правильный сегмент программно, когда пользователь коснулся ячейки.

Итак, мой вопрос: Можно ли создать сегмент из контроллера вида для себя в Interface Builder?

9 70

9 ответов:

Я разработал метод для создания segue с помощью фантомной кнопки. Я верю, что это решит вашу проблему. Вы можете прочитать об этом в моем ответе здесь.

Если вы используете навигационный контроллер, вам нужно нажать ViewController в стек навигации. В этом примере я назвал свой ViewController " VDI " в настройках идентификатора раскадровки.

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil];
YourVC *dest = [storyboard instantiateViewControllerWithIdentifier:@"VDI"];
[self.navigationController pushViewController:dest animated:YES];

Если вы не хотите, чтобы NavigationController продолжал добавлять себя в вашу историю "назад", вы можете вытащить стек перед добавлением к нему таким образом.

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil];
YourVC *dest = [storyboard instantiateViewControllerWithIdentifier:@"VDI"];
UINavigationController *navController = self.navigationController;
[navController popViewControllerAnimated:NO];
[navController pushViewController:dest animated:YES];

с помощью Xcode 5 есть много простое решение.

  1. щелкните ячейку таблицы в раскадровке
  2. откройте инспектор соединений (значок со стрелкой вправо в правом верхнем углу)
  3. в разделе " триггерные сегменты "вы видите"выбор"
  4. перетащите из круга рядом с "выбор" в ячейку в раскадровке

вместо того, чтобы выполнять переход к тому же контроллеру, вы можете создать экземпляр контроллера вида (тот же самый) из раскадровки, а затем нажать его на навигационный контроллер.

в IOS 6, есть более чистое решение чем с помощью фантомной кнопки. Вы все еще можете определить сегмент из ячейки таблицы в контроллер вида и посмотреть на отправителя, чтобы отменить автоматически запускаемый сегмент:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    //storyboards should use segues and override prepareForSegue instead
    //but here we need custom logic to determine which segue to use
    id item = [self.fetchedResultsController objectAtIndexPath:indexPath];
    if (item meets condition) {
        [self performSegueWithIdentifier:@"segue1" sender:self];
    } else {
        [self performSegueWithIdentifier:@"segue2" sender:self];
    }
}

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
    //ignore segue from cell since we we are calling manually in didSelectRowAtIndexPath
    return (sender == self);
}

подход к построителю интерфейса: просто перейдите к ссылке раскадровки, которая ссылается на контроллер представления представления.

правильный ответ-использовать ссылку раскадровки, которая ссылается на UIViewController, который вы хотите перейти к себе, а затем указать на него.

enter image description here

вот как вы можете нажать другой экземпляр текущего контроллера вида без определения segue или жесткого кодирования его собственного идентификатора:

SameViewController *same = [self.storyboard instantiateViewControllerWithIdentifier: self.restorationIdentifier];
[self.navigationController pushViewController: same animated: YES];

вам просто нужно установить идентификатор восстановления таким же, как идентификатор раскадровки (для этого есть флажок в IB).

Restoration ID

надеюсь, что это помогает.

Я обнаружил, что вы можете создать несколько ячеек прототипа.

чем вы можете связать каждую ячейку (в раскадровке)с другим видом.

что-то вроде этого:

NSString *CellIdentifier = @"Cell"; 
if (Condition2 ){
CellIdentifier = @"Cell2"; } 
if (Condition3 ){
CellIdentifier = @"Cell3"; }