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