Подтвердить что ты не робот

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

4b9b3361

Ответ 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;
    }
}