Как указано в документации:
Приложениям обычно не нужно запускать сегменты напрямую.
Вместо этого вы настраиваете объект в Интерфейсном Разработчике, связанный с
контроллер представления, такой как элемент управления, встроенный в его иерархию представлений,
чтобы вызвать переход. Тем не менее, вы можете вызвать этот метод, чтобы вызвать
Программно, возможно, в ответ на некоторые действия, которые не могут
быть указан в файле ресурсов раскадровки. Например, вы можете
вызовите его из обработчика пользовательских действий, используемого для обработки встряхивания или
события акселерометра.
Контроллер представления, который получает это сообщение, должен быть загружен
из раскадровки. Если у контроллера представления нет связанного
раскадровка, возможно, потому что вы выделили и инициализировали ее самостоятельно,
этот метод вызывает исключение.
Как говорится, когда вы запускаете segue
, обычно это потому, что предполагается, что UIViewController
сможет ответить на него определенным идентификатором segue's
. Я также согласен с Дэном Ф., вам следует избегать ситуаций, в которых может возникнуть исключение. Как причина, по которой вы не можете сделать что-то вроде этого:
if ([self canPerformSegueWithIdentifier:@"SegueID"])
[self performSegueWithIdentifier:@"SegueID"];
Я предполагаю, что:
respondsToSelector:
только проверяет, можете ли вы обработать это сообщение во время выполнения. В этом случае вы можете, потому что класс UIViewController
может ответить на performSegueWithIdentifier:sender:
. На самом деле, чтобы проверить, способен ли метод обрабатывать сообщение с определенными параметрами, я думаю, это было бы невозможно, потому что для определения, возможно ли это, он действительно должен его запустить, и при этом NSInvalidArgumentException
будет расти.
- Чтобы создать то, что вы предложили, было бы полезно получить список идентификаторов segue, с которыми связан
UIViewController
. Из UIViewController
документации я не смог найти ничего похожего на это
На данный момент, я думаю, вам лучше всего продолжать с @try
@catch
@finally
.