如何实现显示“有状态”内容的UICollectionViewCells?

时间:2013-02-28 13:38:34

标签: ios user-interface ios6 uicollectionview uicollectionviewcell

我目前正在重构我的报亭应用。

以前,我在自动计算的网格布局中显示了几个自定义UIView s(“CoverView”)(每行3个项目,根据需要包含多行),嵌入滚动视图中,垂直滚动。

每个“CoverView”由

组成
  • 标签(显示问题标题)
  • 图片(显示问题封面)
  • 一个按钮(显示“DOWNLOAD”或 - 如果已下载 - “READ”)
  • 进度条(最初隐藏,显示下载进度)

每个CoverView都有自己的UITapGestureRecognizerUILongPressGestureRecognizer

如果用户点击一次,该按钮将被隐藏,下载进度条会显示并随着下载进度不断更新:

 [issue addObserver:cover forKeyPath:@"downloadProgress" options:NSKeyValueObservingOptionNew context:NULL]; 

(长按识别器用于让用户删除问题)。

所有CoverView都存储在NSMutableDictionary中,并始终保存在内存中。虽然未缩放的图像相当大(1024像素高),但我在滚动时从未遇到过性能问题,可能因为没有那么多问题(因此也没有CoverViews)存储。

由于自行实现的网格布局复杂且难以维护,我想改用UICollectionView。我添加了一个集合视图,并使我的CoverView类继承自UICollectionViewCell(而不是UIView)。

显示和滚动有效,但我遇到了这些问题:

  1. 当需要显示新的一行单元格并且 collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath :( NSIndexPath *)indexPath 时,每次都会调用滚动。

  2. 我试图不重复使用单元格(为了提高性能,奇怪的是),但由于每个单元必须具有重用标识符集(并且“reuseIdentifier”属性为readonly,所以我无法在代码中设置它。

  3. 我不知道在哪里取消KVO观察员的细胞。有没有办法在单元格排队等待重用后收到通知?

  4. 一般来说,我不确定我是否在这里滥用UICollectionView我的具体用例,应该坚持我以前的方法,或者是否只是我无法有效地使用和调整UICollectionView

1 个答案:

答案 0 :(得分:1)

要设置'reuseIdentifier',正确的设计是使用UICollectionView方法:

  • registerClass:forCellWithReuseIdentifier:
  • registerNib:forCellWithReuseIdentifier:

您通常会调用这些方法一次,具体取决于您希望如何提供单元格的实例化(从NIB中膨胀,或通过标准[[ViewClass alloc] init]实例化

注册视图后,您可以在UiCollectionView中使用它们,如下所示:

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"yourReuseId" forIndexPath:indexPath];
    // Collection view handle ALL the work :
    // 1 - retrieves a reusable view if views have already been recycled
    // or 2- instantiate a new one, using the class/nib you registered
    // So, cell SHOULDN'T be nil from here :)


    // Note : from iOS 6, UITableView has a similar auto-instantiation mechanism

}

3 - 取消设置KVO,覆盖UICollectionViewCell的{​​{1}}方法(继承自-(void)prepareForReuse