【问题标题】:viewWillAppear called after cellForItemAtIndexPath?在 cellForItemAtIndexPath 之后调用 viewWillAppear?
【发布时间】:2014-11-12 04:49:51
【问题描述】:

当我快速滑动时,我的一个UIViewControllerUICollectionView 有时会崩溃。它在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 有时没有成功创建。我在viewWillAppear 中创建了self.options

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

    self.options = ...
}

有两种可能:

  1. viewWillAppear 根本没有被调用
  2. viewWillAppear 将在cellForItemAtIndexPath 之后调用

我是否遗漏了代码中的任何内容?谢谢

【问题讨论】:

  • super.viewWillAppear(true)
  • @SaurabhPrajapati 不,这不对。
  • @SaurabhPrajapati 因为如果animatedfalse 那么你应该将false 传递给super
  • 首先调用 [super viewWillAppear:YES/NO] 并将你自己的东西放在下面。
  • 我建议你在 viewdidAppear 中创建 self.options。让我知道它是否有效

标签: ios swift uicollectionview


【解决方案1】:

在默认实现中,collectionView:cellForItemAtIndexPath: 将在 viewWillAppear: 之后被调用。

但是,collectionView:cellForItemAtIndexPath: 最初是由对 [UICollectionView -layoutSubviews] 的调用触发的。您可能正在做其他事情来调用此方法,这解释了您所看到的行为。如果需要,可以在collectionView:cellForItemAtIndexPath: 中设置断点,并查看堆栈跟踪以了解调用它的原因。

【讨论】:

    【解决方案2】:

    在我看来,答案在于您的数据源的另一种方法:您必须呈现的项目数量。

    我猜您在该数据源方法中返回的值不是基于选项数组,而是硬编码。这可以解释为什么要求您为尚未设置的数据提供单元格。

    【讨论】:

    • 是的。 numberOfItemsInSection 将返回另一个数组的编号。但是该数组的计数用于创建我的选项数组。
    • 为什么不使用 MIN(options.count, otherArray.count) 来确保始终拥有所需的数据?
    • 请务必在更改选项数组后调用 collectionView 上的重新加载数据,否则您可能看不到任何行!
    • 是的。在 viewWillAppear 中调用 reloadData 似乎可以解决问题。但是我不知道为什么当我的代码中根本没有 reloadData 时仍然调用 collectionView:cellForItemAtIndexPath。
    【解决方案3】:

    我会假设所有需要的东西都必须在 viewDidLoad 之后出现。

    对于您的选项数组,最安全的解决方案是在选项数组尚不可用时计算选项数组的 getter。当然,计数应该从选项数组中获取,而不是从另一个数组中获取。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-12
      • 1970-01-01
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多