在UIAlertController Action中解除UIViewController会导致崩溃

时间:2018-02-22 21:20:25

标签: ios swift uicollectionview uisplitviewcontroller

我只有一个简单的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

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

问题解决了。

此崩溃是由layoutAttributesForElements引起的。我的缓存数组未被清除,当layoutAttributesForElements被调用时出现崩溃。

如果您有自定义的CollectionView布局,则应始终清除UICollectionViewLayout的prepare()中的缓存。

override func prepare() {
     cache = [UICollectionViewLayoutAttributes]()
     ...
}

这就是问题所在。