Разрушитель Segue от контроллера взгляда к себе

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

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

введите описание изображения здесь

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

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

Ответ 1

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

Ответ 2

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

Ответ 3

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

  • Щелкните ячейку таблицы в раскадровке
  • Откройте инспектор подключений (значок правой стрелки в правом верхнем углу)
  • В разделе "triggered segues" вы видите "выбор"
  • Перетащите из круга рядом с надписью "selection" в ячейку в раскадровке

Что это.

Ответ 4

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

Ответ 5

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

- (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);
}

Ответ 6

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

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

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

Идентификатор восстановления

Ответ 7

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

Ответ 8

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

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

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

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

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