iOS 6 - программный запуск Unwind Segue ничего не делает

При запуске моего приложения оно программно показывает LoginViewController с использованием перехода. Контроллер представления представлен модально с переходом, установленным на перекрестное растворение. После успешной аутентификации я хочу закрыть окно входа в систему, программно запустив переход. Поэтому я добавил это в свой заголовочный файл:

- (IBAction)unwindSegue:(UIStoryboardSegue *)segue;

теперь в IB я могу управлять перетаскиванием от «Владелец файла» LoginViewController к кнопке «Выход» и выбирать unwindSegue:. Это создает ручной переход, он правильно отображается в инспекторах подключений для владельца файла и кнопки «Выход». Затем я нажимаю на только что созданный переход Unwind из сцены в IB и даю ему имя. Если я нажму кнопку «Перейти к» для действия «раскрутить переход», я перейду к объявлению, упомянутому выше.

Пока все хорошо, затем я запускаю этот переход после успешной аутентификации в моем блоке GCD:

....
dispatch_async(dispatch_get_main_queue(), ^
{
    [self performSegueWithIdentifier:@"UnwindSegueIdentifier" sender:self];

    [self.spinner removeFromSuperview];
    self.spinner = nil;
});

..... и ничего не происходит, когда он работает. Спиннер удаляется правильно, но нет никаких признаков того, что этот раскручивающийся переход выполняется.

Точка останова в реализации unwindSegue: никогда не срабатывает. Никаких ошибок не вылетает. В консоль ничего не пишет. Идентификатор правильный, трижды проверял (иначе все равно не получится).

Я посмотрел ответы здесь, здесь и здесь, но, похоже, я ничего не пропустил.

Однако я заметил, что Xcode считает, что unwindSegue: не связан: linked? not linked  ?

Я не могу перетащить из маленького пустого круга перед unwindSegue: и связать его с кнопкой «Выход».

Любая помощь будет оценена.


person Allen Zeng    schedule 19.02.2013    source источник
comment
Почему бы вам просто не позволить кнопке выхода вызвать переход, т. е. подключить кнопку напрямую?   -  person Matthias    schedule 19.02.2013
comment
Спасибо за ваш ответ, но я думаю, что, возможно, я не ясно выразился там ... Кнопка «Выход», о которой я все время говорил, была зеленой кнопкой перехода к выходу, а не реальной кнопкой в ​​представлении.   -  person Allen Zeng    schedule 20.02.2013
comment
Что именно должно вызвать ваш расслабляющий переход? И почему вам нужно делать это асинхронно, т.е. почему вы хотите использовать GCD?   -  person Matthias    schedule 20.02.2013
comment
Переход запускается после успешной аутентификации. Аутентификация выполняется путем вызова веб-службы.   -  person Allen Zeng    schedule 20.02.2013


Ответы (2)


Если вы используете модальный переход для перехода к представлению входа в систему, все, что вам нужно, чтобы вернуться, это вызвать

[self dismissViewControllerAnimated:YES completion:nil];

Точнее, вы должны вызвать его на представляющем контроллере (ваш первый контроллер), но он будет переадресован, если вы позвоните на представленном контроллере. Вы можете использовать блок завершения для любой необходимой очистки. Нет необходимости использовать GCD.

ИЗМЕНИТЬ

Чтобы ответить на дополнительный комментарий: я не совсем уверен из вашего описания, но, похоже, вы реализовали действие раскрутки в контроллере представленного, а не в контроллере представляющего. Сегменты раскрутки позволяют вызывающей стороне что-то делать (например, устанавливать данные) без дополнительного протокола.

person Matthias    schedule 20.02.2013
comment
Спасибо. Я понимаю, что могу позвонить dismissViewControllerAnimated:completion:, однако мне больше любопытно, почему не работает раскрутка. Я только что подключил его к кнопке, но он все еще не работает. Кроме того, использование GCD заключается в том, что вызов веб-службы аутентификации не задерживает пользовательский интерфейс, а не только для закрытия контроллера представления входа в систему. - person Allen Zeng; 20.02.2013
comment
Вы совершенно правы! Я не реализовал переход в нужном месте... Я должен был увидеть это раньше... Спасибо! - person Allen Zeng; 20.02.2013
comment
Заметил, что Xcode по-прежнему сообщает об отключении метода, как показано на скриншоте. Должно быть ошибка - person Allen Zeng; 20.02.2013

Цитирование текста из Технической заметки Apple о переходе отката: чтобы добавить переход отката, который будет запускаться только программно, перетащите, удерживая клавишу Control, от значка контроллера представления сцены к значку выхода, затем выберите действие отмотки для нового перехода во всплывающем меню.

Ссылка на техническое примечание

person Vishal Chaudhry    schedule 06.11.2013