尝试呈现 * 其视图不在窗口层次结构中
Posted
技术标签:
【中文标题】尝试呈现 * 其视图不在窗口层次结构中【英文标题】:Attempt to present * whose view is not in the window hierarchy 【发布时间】:2016-10-28 11:02:06 【问题描述】:我在AppDelegate
中使用以下代码在选择按钮时在应用程序中显示一个弹出窗口,我最终会将其移动到标签超链接,但目前只是测试。
let storyboard = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("test") as! ViewController
let popOverVC = UIStoryboard(name:"Main", bundle: nil).instantiateViewControllerWithIdentifier("sbPopUpID") as! PopUpViewController
storyboard.addChildViewController(popOverVC)
popOverVC.view.frame = storyboard.view.frame
storyboard.view.addSubview(popOverVC.view)
popOverVC.didMoveToParentViewController(storyboard)
self.window?.rootViewController?.presentViewController(storyboard, animated: true, completion: nil)
我第一次选择一个按钮时它可以正常工作,但是在所有后续按钮按下时都会显示以下错误。
2016-10-28 11:27:40.551 testfordeeplinks[20496:104536] 警告: 尝试呈现 谁的观点不是 在窗口层次结构中!
【问题讨论】:
【参考方案1】:对于将来偶然发现此问题的任何人,这就是我解决的方法;
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
appDelegate.window?.rootViewController = storyboard
【讨论】:
【参考方案2】:rootViewController
不一定指当前可见的视图控制器。例如,如果您使用UINavigationController
,rootViewController
将持有对该导航控制器的引用,该导航控制器本身深埋在视图层次结构中,因此当您尝试在其上显示视图控制器时会出错。我建议做的是抓住navController.viewControllers
中的最后一个视图控制器并在上面显示您的弹出窗口。见以下代码:
let appDel = UIApplication.sharedApplication().delegate as! AppDelegate
if let navController = appDel.keyWindow?.rootViewController as? UINavigationController
if let visibleVC = navController.viewControllers.last
visibleVC.presentViewController(storyboard, animated: true, completion: nil)
试一试,让我知道。 :)
【讨论】:
感谢 Jacob,这将返回以下错误:Downcast from"UIViewController" only unwraps optionals, you mean to use '!'? 我没有看到错误,所以我猜你只是忘记粘贴了? :P 来自"UIViewController" 的向下转换仅解包选项,你的意思是使用'!'吗? 哎呀,我的错,我想这就是当您尝试记住确切的语法时会发生的事情!请参阅修改后的答案。 感谢更新,但它似乎没有超过第一个 if 语句,所以视图控制器永远不会加载,有什么想法吗? @雅各布·金以上是关于尝试呈现 * 其视图不在窗口层次结构中的主要内容,如果未能解决你的问题,请参考以下文章
尝试在其视图不在窗口层次结构中的 UIViewController 上呈现 UIViewController
尝试在其视图不在窗口层次结构中的 UIViewController 上呈现 UIViewController
尝试在其视图不在窗口层次结构中的 UIViewController 上呈现 UIViewController
尝试在其视图不在窗口层次结构中的 UIViewController 上呈现 UIViewController