当我快速滑动时,某个UIViewController
UICollectionView
的某个let option = self.options[indexPath.row]
崩溃了。 func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell= collectionView.dequeueReusableCellWithReuseIdentifier("optionCell", forIndexPath: indexPath) as MyCell
let option = self.options[indexPath.row]
return cell
}
中崩溃:
self.options
我发现问题是self.options
有时无法成功创建。我在viewWillAppear
中创建了override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
self.options = ...
}
:
viewWillAppear
有两种可能性:
viewWillAppear
根本没有被调用cellForItemAtIndexPath
我的代码中是否遗漏了任何内容?感谢
答案 0 :(得分:1)
在默认实施中,collectionView:cellForItemAtIndexPath:
后会调用viewWillAppear:
。
但是,collectionView:cellForItemAtIndexPath:
最初是通过调用[UICollectionView -layoutSubviews]
触发的。您可能正在做其他事情来调用此方法,这可以解释您所看到的行为。如果需要,可以在collectionView:cellForItemAtIndexPath:
中设置断点,并查看堆栈跟踪,了解它被调用的原因。
答案 1 :(得分:0)
在我看来,答案在于您的数据源的另一种方法:您必须呈现的项目数。
我猜你在该数据源方法中返回的值不是基于options数组而是硬编码。这可以解释为什么要求您为尚未设置的数据提供单元格。
答案 2 :(得分:0)
我会假设所需的一切必须在viewDidLoad之后出现。
对于您的选项数组,最安全的解决方案是一个getter,它在尚不可用时计算options数组。当然,计数应该来自options数组,而不是来自另一个数组。