尝试在视图不在窗口层级的ViewController展示UIImagePickerController报错
解决“Attempt to present on whose view is not in the window hierarchy!”错误及返回原ViewController的问题
嘿,我一眼就看出问题出在哪了——你现在返回第一个ViewController的方式完全错了!
你在profileButton方法里每次都新建了一个ViewController实例,然后把它present出来。这就导致视图层级乱套了:原来的ViewController还压在第二个ViewController的下面,你又叠了个新的ViewController上去。当你在这个新VC里调用UIImagePicker的时候,系统检测到当前VC的视图根本不在正确的窗口层级里,自然就抛出那个错误,还会因为层级混乱莫名其妙跳回第二个VC。
正确的做法:直接Dismiss当前VC
如果你的第二个ViewController是通过present方式从第一个VC跳过来的,那返回时直接dismiss当前VC就行,根本不用新建实例。把你的代码改成这样:
@IBAction func profileButton(_ sender: Any) { // 直接关闭当前的第二个ViewController,回到之前的那个ViewController self.dismiss(animated: true, completion: nil) }
为什么这能解决问题?
- 这样操作会回到你原来的那个ViewController实例,而不是搞个新的出来,视图层级一下子就清晰了。
- 原来的ViewController的视图本来就在窗口层级里,当你再调用UIImagePickerController时,系统能正确找到可以present它的VC,不会再报错。
额外提醒
如果你需要把profileLink这种数据传递回第一个VC,别想着通过新建实例传——用代理、闭包或者通知中心这些方式才是正道。另外,如果你的跳转是用导航栈的push,那返回就要用popViewController(animated:),别搞混了!
内容的提问来源于stack exchange,提问作者Pietro Messineo
相关产品推荐
相关产品推荐

