it-roy-ru.com

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

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

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

 enter image description here

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

Итак, мой вопрос: возможно ли создать переход от контроллера представления к себе в Интерфейсном Разработчике?

72
Jorge

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

26
T.J.

Если вы используете контроллер навигации, вам нужно поместить 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];
42
Jim True

С использованием Xcode 5 есть намного более простое решение.

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

Вот и все. 

28
John Henckel

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

23
Mustafa

В 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);
}
13
Chris

Подход Interface Builder: просто перейдите к ссылке на раскадровку, которая ссылается на контроллер представления.

11
Joshua C. Lerner

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

 enter image description here

9
Sethmr

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

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

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

 Restoration ID

4
Tomas Andrle

Надеюсь это поможет.

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

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

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

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