博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS开发出错whose view is not in the window hierarchy!的解决
阅读量:6718 次
发布时间:2019-06-25

本文共 1355 字,大约阅读时间需要 4 分钟。

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.

如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)


一个简单的单窗口App在运行时出现错误:

2016-04-07 14:28:48.411 BlurViewAndPopView[4364:168520] Warning: Attempt to present 
on
whose view is not in the window hierarchy!2016-04-07 14:28:48.935 BlurViewAndPopView[4364:168520] Attempting to load the view of a view controller while it is deallocating is not allowed and may result in undefined behavior (
)

该app的功能是在root VC中弹出一个popover视图,其中包含一个表视图,在点击表视图中的某一行时回调root VC中的闭包,完成改行内容的对话框弹出效果.

分析如下:根据错误信息,可以清楚看到在试图弹出对话框时,root VC不在窗口的继承体系中,这意味着此时root VC不在window中.

查看popover的cellSelect回调方法:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {        let selectedItem = items[indexPath]        selectionHandler?(selectedItem: selectedItem)        dismissViewControllerAnimated(true, completion: nil)    }

可以看到在调用root VC注册的selectionHandler闭包之后才做的dismissVC的操作,这显然顺序不对!

我们可以这样修改:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {        let selectedItem = items[indexPath]        defer {            selectionHandler?(selectedItem: selectedItem)        }        dismissViewControllerAnimated(true, completion: nil)    }

好了!现在将selectionHandler的回调放到final中,即可保证在root VC中的操作是在dismissVC之后才开始的,这是root VC应该在window的继承体系中了.

你可能感兴趣的文章
linux子系统的初始化_subsys_initcall()【转】
查看>>
x60系统安装步骤
查看>>
Linux内核同步机制之(三):memory barrier【转】
查看>>
安装Fedora 24后必要的设置
查看>>
ES JVM使用如果超过75%就会GC较多,导致ES索引性能下降
查看>>
elasticsearch源码分析之search模块(server端)
查看>>
【转】如何用 Chrome for Android 做远程遥控 debugging
查看>>
Rails中Form标签JavaScript验证
查看>>
ArcObject开发,程序编译通过,但无法启动的解决
查看>>
Oracle 存储过程的创建,及触发器调用存储过程
查看>>
关于Socket通信服务的心跳包(转)
查看>>
.net面试问答(大汇总)
查看>>
BST B-树 B+树 B*树简介
查看>>
21、ASP.NET MVC入门到精通——ASP.NET MVC4优化
查看>>
Arm-kernel 内存收集【转】
查看>>
HTML5之Canvas标签简要学习
查看>>
du熊学斐波那契I
查看>>
Silverlight1.1架构图
查看>>
js实现获取值传到input里边
查看>>
【原+转】用CMake代替makefile进行跨平台交叉编译
查看>>