У меня есть универсальное приложение, где я использую один и тот же контроллер для раскадровки IPad и IPhone. Я положил UILongPressGestureRecognizer на UITableView, что, когда ячейка нажата на iPhone, она вызывает действие, выполняющее segue:
-(IBAction)showDetail:(id)sender {
UILongPressGestureRecognizer *gesture = (UILongPressGestureRecognizer*)sender;
if (gesture.state == UIGestureRecognizerStateBegan) {
CGPoint p = [gesture locationInView:self.theTableView];
NSIndexPath *indexPath = [self.theTableView indexPathForRowAtPoint:p];
if (indexPath != nil) {
[self performSegueWithIdentifier:SEGUE_DETAIL sender:indexPath];
}
}
}
segue представляет собой подробное представление, выполненное как "push". Первое, что вы должны заметить, это то, что отправитель является NSIndexPath, это единственный способ, которым я нашел для передачи выбранной ячейки. Может быть, есть лучшее решение. Все работает отлично, в некотором смысле, что выполняется segue, и до того, как будет вызвана команда prepareForSegue.
Однако бывает, что на iPad я изменил идентификатор segue на Popover. Теперь все работает частично, выполняется segue, но prepareForSegue не вызывается, поэтому контроллер представления назначения не настроен, как и должно быть.
Что я делаю неправильно?