executeSegueWithIdentifier против instantiateViewControllerWithIdentifier - PullRequest
16 голосов
/ 19 января 2012

Кажется, я не получаю этот SIGABRT, который продолжаю получать. У меня есть это приложение для раскадровки iOS, и в раскадровке у меня есть UITableViewController. Теперь я могу взять ячейку TVC и заставить ее выдвигать контроллер просмотра «segue», но что, если мне нужно остановить действие «segue» при определенных условиях? По-видимому, вы не можете этого сделать, поскольку метод prepareForSegue: sender: не допускает этого, и, похоже, он является единственным обратным вызовом, который вызывается при выполнении перехода.

Итак, я догадался, что могу перейти к tableView: didSelectRowAtIndexPath: и выполнить переход программно. Неоптимальный, но все же…

Ну, оказывается, я не угадал. Или, по крайней мере, я делаю что-то не так. Самый очевидный способ сделать это будет

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self performSegueWithIdentifier:@"TheOtherIdentifier" sender:self];
}

но все приложение зависает с SIGABRT, который не дает никакой полезной информации (и да, я уверен, что именно эта строка вызывает сбой приложения, я проверил с помощью отладчика :) Более того, VC я при попытке загрузки правильно установлен идентификатор, так как следующий код

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UIViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"TheOtherIdentifier"];
    [self.navigationController pushViewController:vc animated:YES];
}

"работает". Кавычки указывают, что это явно не тот способ, которым должен быть выполнен такой переход.

Теперь: идеи?

1 Ответ

8 голосов
/ 19 января 2012

Попробуйте это:

  1. Используйте первый блок кода, а не второй.
  2. В режиме управления раскадровкой перетащите из ячейки в другой контроллер представления. Обратите внимание, что переход создан.
  3. Нажмите на переход. Используйте инспектор атрибутов, чтобы задать последовательность и идентификатор «theOtherIdentifier» (рекомендуется строчная буква «t»). Также выберите стиль «push», если вы используете навигационный контроллер.
  4. Раскадровка создаст экземпляр другого контроллера представления. Убедитесь, что вы не делаете этого в своем коде.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...