2013-02-19 3 views
3

На старте моего приложения он программно показывает LoginViewController с помощью segue. Контроллер представления представлен в виде переходного набора для перекрестного растворения. После успешной проверки подлинности я хочу отклонить вид входа, запрограммировав запуск сеанса размотки. Поэтому я добавил это в мой файл заголовка:iOS 6 - программный запуск Unwind Segue ничего не делает

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

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

До сих пор так хорошо, я тогда запускать эту разматывания SEGUE при успешной аутентификации в моем НОД блоке:

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

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

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

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

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

То, что я заметил, однако, заключается в том, что Xcode думает unwindSegue: является не связаны между собой: linked? not linked?

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

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

+0

Почему вы просто не позволить кнопка выхода вызвать переход, то есть провод кнопку непосредственно? – Matthias

+0

Спасибо за ваш ответ, но я думаю, что я, возможно, не выразил себя там четко ... Кнопка «Выход», о которой я все время говорила, была зеленой кнопкой выхода на сцену, а не фактической кнопкой на экране –

+0

Что именно должно вызывать разворот? И почему вам нужно делать это асинхронно, то есть почему вы хотите использовать GCD? – Matthias

ответ

8

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

[self dismissViewControllerAnimated:YES completion:nil]; 

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

EDIT

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

+1

Спасибо. Я понимаю, что я могу называть 'rejectViewControllerAnimated: completion:', но мне более любопытно, почему раскручивание segue не работает. Я только что подключил его к кнопке, но он все еще не работает. Кроме того, использование GCD заключается в том, что вызов веб-службы аутентификации не задерживает пользовательский интерфейс, а не просто отклоняет контроллер входа в систему. –

+0

@AllenZeng: Смотрите мое редактирование. – Matthias

+0

Ты совершенно прав! Я не реализовал segue в нужном месте ... Я должен был увидеть это раньше ... Спасибо! –

2

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

Link to the Technical Note