performSegueWithIdentifier vs instantiateViewControllerWithIdentifier

Кажется, я не получаю этот 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];
}

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

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

16
задан Morpheu5 19 January 2012 в 13:14
поделиться