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