PerformSegueWithIdentifier vs instantiateViewControllerWithIdentifier - программирование
Подтвердить что ты не робот

PerformSegueWithIdentifier vs instantiateViewControllerWithIdentifier

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

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

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

- (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];
}

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

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

4b9b3361

Ответ 1

Попробуйте следующее:

  • Используйте первый блок кода, а не второй.
  • В управлении раскадрой перетащите из ячейки в другой контроллер представления. Обратите внимание, что создается segue.
  • Нажмите на сегмент. Используйте инспектор атрибутов, чтобы указать сегмент и идентификатор "theOtherIdentifier" (рекомендуется нижний регистр "t" ). Также выберите стиль segue "push", если вы используете навигационный контроллер.
  • Storyboard будет создавать экземпляр другого контроллера представления. Убедитесь, что вы не делаете этого в своем коде.