Я пытаюсь создать механизм для разворачивания списка файлов/папок. Идея состоит в том, чтобы показывать один и тот же контроллер представления списка файлов каждый раз, когда пользователь выбирает папку, и показывает контроллер подробного представления файла, если он/она выбирает файл.
До сих пор я создал 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"; }