【问题标题】:UICollectionView is not updating properly - used THStringyFlowLayoutUICollectionView 没有正确更新 - 使用了 THStringyFlowLayout
【发布时间】:2014-03-11 20:06:09
【问题描述】:

当我的应用程序启动时,它会从持久性中获取数据并在我的集合视图中显示 5 个单元格。这些单元格看起来像普通的 TableView 单元格,但我使用 Collection View 来进行以后的布局调整。填满整个屏幕需要 8 个单元格。

此后一秒,模型更新为 19 个单元格的数据,集合视图通过调用更新:

[self.collectionView reloadData];

已经显示的 5 个单元格用新数据很好地刷新了,仅此而已。在我触摸屏幕并向下滚动单元格的高度之前,不会显示其他单元格。然后立即显示 3 个单元格并填满屏幕。从那一刻起,一切都很好,但在我滚动之前,它没有正确更新。

当我调试它时,我看到,collectionView:numberOfItemsInSection: 在调用 reloadData 后被调用,它返回正确的数字 19,但 collectionView:cellForItemAtIndexPath: 只询问这 5 个单元格(直到我滚动)。

这里有点绝望,谢谢你的帮助。

编辑 - 添加源代码:

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
    return 1;
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    return [self.manager.jubilees count];
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    DLog(@"asked for cell: %i", indexPath.row); //just for debugging to know, what is going on
    JUJubileeCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"JubileeCell"
                                                                forIndexPath:indexPath];
    cell.jubilee = self.manager.jubilees[(NSUInteger) indexPath.row];
    return cell;
}

// called when model is updated
-(void)jubileesUpdated {
    DLog(@"jubileesUpdated");
    [self.collectionView reloadData];
}

编辑 2: 加载前 5 个单元格时,[self.collectionView contentSize] 为 (width=320, height=358)。 当加载所有 19 个单元格并调用 reloadData 时,contentSize 为 (width=320, height=1366) - 但单元格实际上并未显示:(。

编辑 3: 问题是由使用 THStringyFlowLayout 引起的 - 如果我找到原因,我会发布更多。

【问题讨论】:

  • 如果您不滚动但等待一分钟左右会发生什么?可能与线程有关。延迟出现的单元格是从不是主线程的线程进行调用的症状。因此,请确保从 mainThread 调用 reloadData。例如,在reloadData 之前添加NSAssert([NSThread isMainThread], @"not on main thread");。这基本上是我能想到的唯一问题。
  • 这点很好,但不幸的是它在主线程上更新了:(。我在开始处理这个问题时已经关闭了所有多线程。

标签: ios objective-c uicollectionview


【解决方案1】:

尝试将要刷新的所有索引路径添加到数组中并尝试使用 [_collectionView reloadItemsAtIndexPaths:arayOfAllIndexPaths]

【讨论】:

  • 谢谢,它会起作用,但它是非常丑陋和残酷的解决方案(创建几个 NSIndexPath 对象并仅在一个非常特殊的情况下使用它们以防止这种奇怪的行为)。原则上一定有问题,这不是我正在寻找的解决方案。不过还是谢谢啦!
  • 好吧,我试过了(真的很绝望:))但它实际上也不起作用:*** Assertion failure in -[UICollectionViewData layoutAttributesForItemAtIndexPath:], /SourceCache/UIKit/UIKit- 2935.137/UICollectionViewData.m:597 :)
【解决方案2】:

在主线程上重新加载你的集合视图

【讨论】:

  • 我不知道为什么你被否决了。这是我的问题的解决方案,因为我试图在使用 AWS S3 完成任务后重新加载。解决方案是使用dispatch_async(dispatch_get_main_queue(), ^{ });
【解决方案3】:

这主要是在黑暗中拍摄,但这听起来可能是一个重绘错误。尝试将-setNeedsDisplay 发送到集合视图以使其自身重绘。

【讨论】:

    【解决方案4】:

    如果没有看到任何实际代码,很难猜测,但请确保单元格的尺寸是正确的,无论是从您的项目大小委托或流程布局上的参数(无论您使用什么)。

    对于您所描述的,似乎集合视图认为只有 3 个单元格是可见的,并且由于单元格加载根据显示的单元格是惰性的,因此只会将前 3 个单元格出列。

    编辑:还要确保将正确的 indexPath 传递给 dequeuecell 方法。

    【讨论】:

    • 我添加了源代码。对不起,我应该先把它贴在这里。但是没什么可看的:(。
    • 我仍在调试,请参阅我的编辑 2。谢谢。
    【解决方案5】:

    各位,谢谢帮忙!

    问题出在流程布局中。我正在使用 THSpringyFlowLayout(这就是我实际使用 Collection View 的原因),没有它,一切正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多