UICollectionView无需重用单元格

时间:2014-07-06 21:51:49

标签: ios objective-c cocoa-touch

好奇,是否可以禁用UICollectionview上的重用功能? 我的细胞数量有限,可能会有所不同,但细胞的重新初始化可能有点重,我最好不要重复使用它们。 尝试在没有dequeueReusableCellWithReuseIdentifier的情况下初始化单元格我得到了异常:

  

NSInternalInconsistencyException',原因:'从collectionView:cellForItemAtIndexPath:返回的视图未通过调用-dequeueReusableCellWithReuseIdentifier:forIndexPath检索。

2 个答案:

答案 0 :(得分:7)

  

细胞的重新初始化可能有点重

重置单元格的内容不太可能比创建新单元格更昂贵 - 单元格重用的全部要点是通过避免不断创建新单元格来提高性能。

  

尝试在没有dequeueReusableCellWithReuseIdentifier的情况下初始化单元格我得到了异常:

我认为这表明你的问题的答案是。此外,the documentation says

  

...集合视图要求您始终将视图出列,而不是在代码中显式创建它们。

再次,没有

答案 1 :(得分:6)

要禁用单元格重用,只需使用该单元格索引路径的特定标识符对单元格进行出列,然后手动注册该标识符。

<%
   Dim objConn
   Session.Timeout=15
   Set objConn=Server.CreateObject("ADODB.Connection")
   objConn.ConnectionString="DSN=servername;Uid=Username;Pwd=Password"
   objConn.Open 
   %>

请注意,在上述方法中重用并不是完全禁用,因为每个单元都有一个标识符,这是每个人可能需要的。但是,如果您需要完全禁用单元重用,则可以执行以下操作。

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *identifier = [NSString stringWithFormat:@"Identifier_%d-%d-%d", (int)indexPath.section, (int)indexPath.row, (int)indexPath.item];
    [collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:identifier];

    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];

    // ...
    // ...
    // ...
}

重要:我在这里回答这个问题,这完全是不推荐,特别是第二种方法。我在第一种方法中使用第一种方法来进行多方向滚动,并且有一些关于专注于tvOS的委托方法,我需要为每个单元调用它。