2014-12-16 5 views
2

У меня есть приложение Swift, и я бы хотел, чтобы каждый раз, когда приложение становится активным, я хотел бы проверить пользователя на сеансе , Если не найден, я бы хотел показать контроллер входа в систему, который я создал в своей раскадровке. Если найдено, мне нужно все, чтобы просто вернуться, как обычно.iOS viewWillAppear Ошибка: «вид не находится в иерархии окон»

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

Я делаю это, чтобы иметь дело с восстановлением государства, а также ищу пользователь в сессии:

func application(application: UIApplication, shouldRestoreApplicationState coder: NSCoder) -> Bool { 
    return <userInSession> != nil 
} 

Я создал SEGUE из дома зрения контроллера для входа просмотра контроллера. В методе viewDidAppear контроллера view view я проверяю, чтобы пользователь выполнил вход. Если они не вошли в систему, я выполняю segue для контроллера входа в систему.

Как только пользователь входит в систему, я просто уменьшаю контроллер входа в систему.

Проблема заключается в том, что, поскольку я использую viewDidAppear, контроллер домашнего вида просматривается на долю секунды, прежде чем контроллер входа в систему появится в случае, если пользователь не войдет в систему. Я хочу этого избежать. Я попытался с помощью метода viewWillAppear, но который производит следующее сообщение об ошибке:

2014-12-14 23: 42: 52.910 APPNAME [78187: 18685210] Внимание: попытка представить < appname.LoginUIViewController: 0x7fdcc1616970> на < APPNAME. HomeUITabBarViewController: 0x7fdcc1746610> чей вид не находится в иерархии окон!

Любые мысли о том, как справиться с ситуацией?

+0

Вы пробовали делать сегу без анимации? – rdelmar

+0

@rdelmar Да, у меня есть. Вид по-прежнему отображается в течение секунды секунды - выглядит не очень красиво –

ответ

0

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

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

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

Когда приложение закрывается, сохраните состояние приложения, вернув YES в mustSaveApplicationState. Когда перезапускается приложение, вызывается shouldRestoreApplicationState. Там вы проверяете, зарегистрирован ли пользователь, и возвратите НЕТ, если нет, так что состояние не восстановлено. Это должно заставить пользователя начать приложение, т. Е. Ваш логин.

Смежные вопросы