PrepareForSegue не вызывается, когда я нажимаю кнопку без использования функции performSegueWithIdentifier
Основываясь на курсе iOS в Стэнфорде, я играю с модульными контроллерами. В демонстрации у них есть кнопка, которая запускает модальное представление, и когда она нажимается, вызывается функция prepareForSegue. Я подражал коду и реализации в моем проекте, с той лишь разницей, что мое демо находится на раскадровке iPhone, а их на iPad.
Я заметил, что пока мой контроллер модального просмотра подходит, он до этого не вызывает prepareForSegue. Я обыскал проект в Стэнфорде, чтобы увидеть, где они могут регистрировать любое поведение segue перед вызовом команды prepareForSegue, но нет никаких доказательств. Может кто-нибудь пролить некоторый свет на это. Я искал переполнение стека, и все, что я обнаружил, заключалось в том, что пользователям не удалось выполнить вызов executeSegueWithIdentifier. Тем не менее, в демонстрации в Стэнфорде они никогда этого не делают.
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier hasPrefix:@"Create Label"]) {
AskerViewController *asker = (AskerViewController *)segue.destinationViewController;
asker.question = @"What do you want your label to say?";
asker.answer = @"Label Text";
asker.delegate = self;
}
}
Вот пример раскадровки:
![enter image description here]()
Вот пример моей раскадровки:
![enter image description here]()
В отладчике, когда я останавливаюсь в демонстрационном коде Стэнфорда, стек вызовов показывает, что раскадровка выполняет действие segue, что мне нужно настроить в моей раскадровке для достижения того же результата?
![enter image description here]()
Ответы
Ответ 1
Ну, как оказалось, мой контроллер просмотра, где кнопка вызывает модальное представление, не имеет нужного класса, в котором реализуется prepareForSegue. Это был UIViewController по умолчанию вместо моего пользовательского класса.
То, как я это понял, было, поставив точку останова в viewDidLoad, и даже это не нарушалось, и поэтому я подозревал, что в раскадровке у меня не было подходящего класса, связанного с представлением, в котором эта кнопка реализована.
Ответ 2
При подключении автоматического сегмента для представления таблицы в дополнение к ответу Amro (не назначая соответствующий подкласс) еще два случая, когда prepareForSegue
может не вызываться. Убедитесь, что у вас есть:
-
подключил segue из ячейки прототипа представления таблицы, не диспетчер представлений таблиц.
-
использовал сегрегацию из группы "Селекция выбора" во всплывающем меню segue connection, не в разделе "Аксессуарное действие".
![Подключить автоматические сегменты]()
[Нажмите, чтобы увеличить]
Ответ 3
Будет ли его код Modal или Push Segue под кодом всегда называться
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"Create Label"]) {
SignUpViewController *asker = segue.destinationViewController;
}
}
Ответ 4
Для других с этой проблемой, если вы используете Swift 3, имеющую следующую функцию, не будет вызывать ошибки, так как это правильный синтаксис, но он не будет работать, потому что это функция Swift 2:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// code
}
Вы должны обновить функцию Swift 3 "подготовить", чтобы она работала для segues:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// code
}
Ответ 5
У меня была аналогичная проблема с UICollectionViewCell
как источник segue.
Кажется, что для работы раскадровки (без performSegueWithIdentifier
) требуется, чтобы у вас был пользовательский подкласс UICollectionViewCell
, и используйте его как Class
для CollectionViewCell
на доске объявлений.
Ответ 6
В моем случае я не устанавливал модуль под именем класса в раскадровке контроллера вида, содержащего segue. Он не был установлен, и как только я нажал в поле модуля, он установил правильный проект/модуль и разрешил проблему.
Ответ 7
У меня была аналогичная проблема.
Мыслительный процесс:
- убедитесь, что у вас есть правильная подпись метода. Он изменился в Swift 3.
- Затем убедитесь, что вы подключили кнопку (или что-то другое, что запускает сеанс), совпадение с тем, как вы подключили segue в раскадровке. Иногда вы вызываете кнопку, но не подключили ее с этой кнопки до целевого контроллера представления.
- Убедитесь, что идентификатор сегмента указан правильно. Хотя это и не причина, почему prepareForSegue не вызван, это единственная причина, по которой не определен конкретный сеанс.
Ответ 8
В моем случае это было вызвано тем, что мой контроллер расширил еще один контроллер (Eureka Form View Controller = FormViewController), который реализовал функцию executeSegue следующим образом:
open override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// code
}
Моя функция была реализована следующим образом:
func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// code
}
Чтобы решить эту проблему, я просто добавил переопределение до:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// code
}
Voila!
Ответ 9
В моем случае у меня есть базовый класс для нескольких контроллеров представлений в моем проекте. Этот базовый класс имеет реализацию prepareForSegue()
, которая не вызывалась в каждом случае. Проблема заключалась в том, что в одном из моих контроллеров представления, который наследуется от базового класса и переопределяет его реализацию prepareForSegue()
, я забыл называть super.prepareForSegue()
.
Ответ 10
Во-первых, вам нужно выбрать на вашей кнопке + ctrl перетащить элемент, чтобы вы могли видеть контроллер, выберите серию выделения. Позже вы должны правильно определить идентификатор segue.
Не подключайтесь к одному контроллеру представления к другому контроллеру представления.
импортируйте UIKit.framework для этого
Затем этот метод будет вызван.
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"identifierName"])
{
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
ExampleViewController *destViewController = segue.destinationViewController;
}
}