我只有一个简单的UIAlertController,我点击按钮显示它:
let alert = UIAlertController(title: "", message: NSLocalizedString("Are you sure you want to log out?", comment: ""), preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "Sign Out", style: UIAlertActionStyle.default, handler: { (alert: UIAlertAction) in
self.dismiss(animated: true, completion: nil) // CRASH
}))
alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.default, handler: nil))
self.present(alert, animated: true, completion: nil)
我想用这个对话框动作解雇我的控制器。
因此,当我点击“警报”中的“注销”按钮时,我的应用程序崩溃了。
崩溃日志:
断言失败 - [UICollectionViewData validateLayoutInRect:],/ BuildRoot / Library / Cache / com.apple.xbs / Source / UIKit_Sim / UIKit-3698.33.6 / UICollectionViewData.m:435 2018-02-23 00:11:17.741531 + 0300 App [4681:1373962] *由于未捕获的异常'NSInternalInconsistencyException'终止应用程序,原因:'UICollectionView接收到索引路径不存在的单元格的布局属性:{length = 2,path = 0 - 0}'
BUT!我根本没有CollectionView。
注意:如果我只使用一个简单的self.dismiss(...)而没有此警报操作,那么我的控制器就会被正常解雇。
注2:我想解雇的控制器是SplitViewController,我没有任何CollectionViews。
注3:我使用self.present(splitVC,animated:true)以简单的方式呈现我的SplitViewController
有什么建议吗?
答案 0 :(得分:0)
问题解决了。
此崩溃是由layoutAttributesForElements引起的。我的缓存数组未被清除,当layoutAttributesForElements被调用时出现崩溃。
如果您有自定义的CollectionView布局,则应始终清除UICollectionViewLayout的prepare()中的缓存。
override func prepare() {
cache = [UICollectionViewLayoutAttributes]()
...
}
这就是问题所在。