iOS开发出错whose view is not in the window hierarchy!的解决
2016-04-07 14:38
651 查看
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)
一个简单的单窗口App在运行时出现错误:
2016-04-07 14:28:48.411 BlurViewAndPopView[4364:168520] Warning: Attempt to present <UIAlertController: 0x7a0a4e00> on <BlurViewAndPopView.ViewController: 0x797757d0> 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 (<UIAlertController: 0x7a0a4e00>)
该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的继承体系中了.
相关文章推荐
- iOS字体笔记
- iOS:状态栏提示控件的实现原理
- iOS绘图 - 自定义饼图的绘制
- iOS 无证书真机调试
- IOS简单的定位
- iOS - 解决短时间多次点击按钮,多次响应的问题
- iOS绘图 - 自定义柱状图绘制
- iOS8中的动态文本
- (转载)iOS开发系列--音频播放、录音、视频播放、拍照、视频录制
- iOS 打包ipa之Missing iOS Distribution signing identity问题
- iOS OC KVC KVO 实现原理详解
- iOS绘图 - 基本线条的绘制
- iOS开发:协议与代理
- iOS SDK开发
- iOS开源弹幕库BarrageRenderer
- iOS 证书的事
- iOS图片裁剪和小图看大图动画
- IOS delegate 实例
- iOS 获取通讯录里边的电话号码AddressBook
- iOS解决键盘弹出遮挡输入框问题