iOS + Storyboard: повторное использование ViewController в навигации

в моем текущем приложении я хочу использовать определенный UICollectionView несколько раз, но с другим поведением выбора. Рассмотрим следующий макет раскадровки как «есть» (и работающий):

Tab Bar Controller (2 items):
-> Navigation Controller 1 -> Collection View Controller -> some Table View Controller
-> Navigation Controller 2 -> (Basic) View Controller

Basic View Controller имеет два UIButtons, которые имеют Push соединения Storyboard с Collection View Controller. Я хочу перейти от Basic View Controller к Collection View Controller, но выбор элемента из коллекции должен вывести представление и вернуться к Basic View Controller.

Я установил пользовательское свойство в Collection View Controller, которое устанавливается в соответствующем сообщении prepareForSegue Basic View Controller (или вообще не устанавливается, если пользователь выбирает Tab Bar Item), поэтому нет проблем с определением того, какой контроллер или какой компонент пользовательского интерфейса инициировал push ( есть 3 способа: выбор элемента панели вкладок или нажатие одной из кнопок в основном представлении).

Проблема заключается в том, чтобы вытолкнуть файл Collection View.

Мой код до сих пор:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ( self.mode == nil ) {
        // do nothing
    } else if ( [self.mode isEqualToString:@"foobar"] ) {
        // one way I tried
        [self dismissViewControllerAnimated:YES completion:nil];
    } else if ( [self.mode isEqualToString:@"blah"] ) {
        // other method
        BasicViewController *targetVC = self.navigationController.viewControllers[ 0 ];
        [self.navigationController popToViewController:targetVC animated:YES];
    }
}

К сожалению, мое приложение вылетает в строках dismiss соответственно. popToViewController. Возможно ли использовать одни и те же контроллеры представления для разных способов навигации?

Я надеюсь, что информации достаточно, чтобы помочь мне в этом. Как вы, возможно, знаете, проекты растут, и я не знаю, есть ли еще код для рассмотрения :)

Заранее спасибо!


person Dennis    schedule 21.04.2013    source источник


Ответы (2)


Метод prepareForSegue: не подходит для размещения этого кода. Он вызывается непосредственно перед выполнением перехода, что обычно означает, что уже должен произойти какой-то переход.

Я предполагаю, что вы соединили свои ячейки представления коллекции с переходом и теперь пытаетесь изменить поведение этого перехода в зависимости от контроллера представления «до» collectionVC.

В этом случае есть несколько возможных решений:

  • не используйте переходы для этого конкретного перехода и выполняйте любые vc-переходы вручную
  • напишите свой собственный подкласс UIStoryboardSegue, который может обрабатывать различные переходы. См. справочник по классу UIStoryboardSegue. Затем вы можете установить некоторое свойство вашего пользовательского перехода в методе prepareForSegue:, чтобы сообщить переходу, какой переход он должен выполнить.
  • использовать раскручивающиеся сегменты. См. Для чего нужны переходы Unwind и как их использовать?
person Tobi    schedule 21.04.2013

Действие выбранной строки в вашем «Контроллере представления коллекции» различается в зависимости от того, откуда был представлен «Контроллер представления коллекции». В одном случае вернитесь к «Базовому контроллеру представления», а в другом — к «какому-то контроллеру табличного представления».

Реализуйте это, определив tableView:didSelectRowAtIndexPath: примерно так:

- (void)        tableView: (UITableView *) tableView 
  didSelectRowAtIndexPath: (NSIndexPath *) indexPath
{
   if (self.parentIsBasicViewController)  // set in the incoming segue, probably.
      [self.presentingviewController dismissViewControllerAnimacted: YES completion: nil]
   else
      [self performSegueWithIdentifier: @"some Table View Controller" sender: self];
}
person GoZoner    schedule 21.04.2013