Раскадровка Segue От контроллера представления к себе - PullRequest
74 голосов
/ 10 февраля 2012

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

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

enter image description here

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

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

Ответы [ 9 ]

43 голосов
/ 16 апреля 2013

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

Используя Xcode 5, существует намного более простое решение.

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

Вот и все.

26 голосов
/ 10 февраля 2012

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

23 голосов
/ 29 июля 2012

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

15 голосов
/ 26 июля 2017

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

13 голосов
/ 27 апреля 2013

В 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);
}
11 голосов
/ 10 января 2018

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

4 голосов
/ 19 июля 2016

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

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

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

Restoration ID

0 голосов
/ 28 сентября 2013

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

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

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

Примерно так:

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