Ответ 1
Я разработал метод создания segue с помощью кнопки phantom. Я считаю, что это решит вашу проблему. Вы можете прочитать об этом в моем ответе здесь.
Я пытаюсь создать механизм для разворачивания списка файлов/папок. Идея состоит в том, чтобы показывать один и тот же контроллер представления списка файлов каждый раз, когда пользователь выбирает папку, и показывает контроллер подробного представления файла, если он/она выбирает файл.
До сих пор я создал segue из контроллера представления списка файлов в контроллер представления подробного представления файла и segue из ячейки представления таблицы списка файлов в контроллер представления таблицы списка файлов:
Проблема заключается в том, что, как только пользователь удаляет ячейку, выполняется segue. Я хотел бы удалить segue из ячейки представления таблицы и сделать ее из контроллера представления списка файлов самому себе. Таким образом, я мог бы запрограммировать правильное segue, когда пользователь постучал по ячейке.
Итак, мой вопрос: возможно ли создать segue из контроллера представления в себя в Interface Builder?
Я разработал метод создания segue с помощью кнопки phantom. Я считаю, что это решит вашу проблему. Вы можете прочитать об этом в моем ответе здесь.
Если вы используете навигационный контроллер, вам нужно нажать 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, существует более сильное решение .
Что это.
Вместо выполнения segue на том же контроллере вы можете создать экземпляр контроллера представления (тот же) из раскадровки, а затем нажать его на контроллер навигации.
В 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);
}
Здесь вы можете нажать другой экземпляр текущего контроллера представления, не определяя собственный или жесткий код своего собственного идентификатора:
SameViewController *same = [self.storyboard instantiateViewControllerWithIdentifier: self.restorationIdentifier];
[self.navigationController pushViewController: same animated: YES];
Вам просто нужно установить идентификатор восстановления так же, как идентификатор раскадровки (там есть флажок для IB).
Подход Interface Builder: просто перейдите к ссылке на раскадровку, которая ссылается на контроллер представления.
Надеюсь, что это поможет.
Я обнаружил, что вы можете создавать несколько прототипов.
Чем вы можете связать каждую ячейку (в раскадровке) с другим представлением.
Что-то вроде этого:
NSString *CellIdentifier = @"Cell";
if (Condition2 ){
CellIdentifier = @"Cell2"; }
if (Condition3 ){
CellIdentifier = @"Cell3"; }