iOS viewWillAppear 错误:“视图不在窗口层次结构中”

Posted

技术标签:

【中文标题】iOS viewWillAppear 错误:“视图不在窗口层次结构中”【英文标题】:iOS viewWillAppear Error: "view is not in the window hierarchy" 【发布时间】:2014-12-16 18:57:38 【问题描述】:

我有一个 Swift 应用程序,我想做的是每次应用程序激活时,我想检查会话中的用户。如果找不到,我想展示我在 Storyboard 中设计的登录视图控制器。如果找到了,我需要一切照常恢复。

我有另一个主视图控制器,它被设置为我的初始视图控制器。如果找不到用户,我不希望主视图控制器显示。

我这样做是为了处理状态恢复,同时也在会话中寻找用户:

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

我创建了一个从主视图控制器到登录视图控制器的 segue。在主视图控制器的 viewDidAppear 方法中,我检查以确保用户已登录。如果他们未登录,我会执行登录视图控制器的 segue。

一旦用户登录你,我就会关闭登录视图控制器。

问题在于,因为我使用 viewDidAppear,所以在登录视图控制器出现之前会看到主视图控制器片刻,以防用户未登录。我想避免这种情况。我尝试使用 viewWillAppear 方法,但这会产生以下错误:

2014-12-14 23:42:52.910 appname[78187:18685210] 警告:尝试在 <0x7fdcc1746610>

【参考方案1】:

我认为您无法避免首先显示主页视图,即您设置它的方式。 (当在某些情况下需要绕过流程中的视图时,我已经看到了您所描述的问题。)

尝试重新排列你的故事板,让登录视图控制器在前,然后转到主视图控制器。

当用户第一次运行应用程序时,他/她需要先登录。成功登录后,用户转到主视图控制器及其他位置。

当应用关闭时,通过在 shouldSaveApplicationState 中返回 YES 来保存应用状态。当应用重新启动时,会调用 shouldRestoreApplicationState。在那里您检查用户是否已登录,如果没有则返回 NO,因此该状态不会恢复。这应该强制用户开始应用程序,即您的登录视图。

【讨论】:

以上是关于iOS viewWillAppear 错误:“视图不在窗口层次结构中”的主要内容,如果未能解决你的问题,请参考以下文章

IOS 将值从 App Delegate 传递到初始视图控制器并在 viewWillAppear 中使用这些值

iOS - viewDidLoad, viewWillDisappear, viewWillAppear区别及加载顺序

阻止在 viewWillAppear 中打开窗口

ViewWillAppear 被调用两次

iOS 生命周期 -initviewDidLoadviewWillAppearviewDidAppearviewWillDisappearviewDidDisappear 区别和用途

viewDidAppear 未调用但 viewWillAppear 调用仅出现在 iOS5