【问题标题】:UICollectionView Not Loading CellsUICollectionView 不加载单元格
【发布时间】:2015-08-13 16:13:54
【问题描述】:

这是我的cellForItemAtIndexPath 代码:

    static NSString *cellIdentifier = @"Cell";
    MyCustomCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
    //do stuff, set label text

if (indexPath.section == 0) cell.label.text = [words1 objectAtIndex:indexPath.row];
else if (indexPath.section == 1) cell.label.text = [words2 objectAtIndex:indexPath.row];
else if (indexPath.section == 2) cell.label.text = [words3 objectAtIndex:indexPath.row];

    return cell;

我在viewDidLoad注册单元格类型:

[_collectionView registerClass:[MyCustomCell class] forCellWithReuseIdentifier:@"Cell"];

我在我的故事板中设置了我的集合视图,委托和数据源正常链接。

现在我的问题...我有两种方法,都有问题。我有 3 个部分,每个部分都来自一个独特的数据数组。

  1. 获取所需数据后,我使用[_collectionView reloadData]。这会根据数组计数加载正确数量的单元格,但不会填充屏幕外的单元格。所以当我在屏幕上滚动它们时,它们没有设置标签。

  2. 我尝试使用以下代码(每个部分一次)在获取数据(首选路线)时重新加载每个部分:

    [self.collectionView performBatchUpdates:^{ [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:0]]; } completion:nil];

但是,使用此方法的问题在于,在重新加载后,它会用正确数量的单元格填充我的集合视图,但单元格本身是空白的,标签上没有设置文本。

在这两种情况下,如果我在屏幕上、屏幕外滚动并再次打开非加载单元格,它们就会加载。但你第一次看到它们时,它们并没有。

【问题讨论】:

  • 此代码表示只在给定部分的前 3 个单元格上设置标签,因此您的问题出在 cellForRowAtIndexPath 中。您可能是指 indexPath.section ==0 { cell.label.text = @"text" }
  • 1. else if (indexPath.row == 2) cell.label.text = @"这里的文字";。所以第 4 行没有标签。
  • 尝试使用 NSString 为您拥有的所有单元格创建一个数组。如您所见,4 行的单元格不会显示任何文本。并且此代码适用于您的所有部分(您不检查单元格的部分)
  • 哎呀!我是个大笨蛋,打错字了。大脑现在处于运转状态,请参阅我更正的代码。我一直在按照部分从数组中设置文本。对此感到抱歉。
  • 你能把你的项目上传到github吗?

标签: ios objective-c uicollectionview reloaddata


【解决方案1】:

已解决。将您的 UI 代码,例如在 layoutSubviews 方法中创建 UILabel(不是 nil)是不好的。

将此代码移至我的自定义 UICollectionViewCell 子类上的 init 方法,如果单元格 UI 不一致,则解决了我的问题。

【讨论】: