4

我一直想知道为什么我的代码在获取集合视图单元格时可以很好地工作而cellForItemAtIndexPath:不是。dequeueReusableCellWithReuseIdentifier:

这是我的代码:

这个工作正常:

NSInteger numberOfCells = [self.collectionView numberOfItemsInSection:0];
    for (NSInteger i = 0; i < numberOfCells; i++) {
        myCustomCollectionCell *cell = (myCustomCollectionCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:i inSection:0]];
        //here I use the cell..
    }

虽然这编译得很好,但不起作用(我在单元格上执行的更改未描述)

NSInteger numberOfCells = [self.collectionView numberOfItemsInSection:0];
        for (NSInteger i = 0; i < numberOfCells; i++) {
            myCustomCollectionCell *cell = [self.collectionView dequeueReusableCellWithReuseIdentifier:@"myCell"forIndexPath:[NSIndexPath indexPathForItem:i inSection:0]];
            //here I use the cell..
        }

也试过这个,但没有用:

NSInteger numberOfCells = [self.collectionView numberOfItemsInSection:0];
        for (NSInteger i = 0; i < numberOfCells; i++) {
            myCustomCollectionCell *cell = (myCustomCollectionCell *)[self.collectionView dequeueReusableCellWithReuseIdentifier:@"myCell"forIndexPath:[NSIndexPath indexPathForItem:i inSection:0]];
            //here I use the cell..
        }

有任何想法吗?

4

2 回答 2

6

这两个基本上是两种截然不同的方法。

  1. dequeReusableCellWithReuseIdentifier:假设您有要查看的文章列表。假设您有 50 篇文章。屏幕不会一次在屏幕上显示所有 50 篇文章。它会根据您为行指定的高度一次向您显示有限的单元格。假设屏幕一次只显示 5 篇文章,现在您位于列表顶部。该列表将显示项目 1-5。现在,当您滚动时,为了显示第 6 个项目,列表会重用您的第一个单元格,将其配置为第 6 个并显示它。此时,您的第一个单元格已不在视野范围内。

2. cellForRowAtIndexPath:另一方面,cellForRowAtIndexPath返回已在视图中或从您提供的 IndexPath 中的单元格。在这种情况下,如果单元格已经在内存中,它将只返回该单元格,或者它将配置一个新单元格并返回。

下面的示例是针对 UITableViews 的,但 UICollectionViews 可以以相同的方式处理。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    /*
     *   This is an important bit, it asks the table view if it has any available cells
     *   already created which it is not using (if they are offscreen), so that it can
     *   reuse them (saving the time of alloc/init/load from xib a new cell ).
     *   The identifier is there to differentiate between different types of cells
     *   (you can display different types of cells in the same table view)
     */

    UITableViewCell *cell = [tableView dequeueReusableCellWithReuseIdentifier:@"MyIdentifier"];

    /*
     *   If the cell is nil it means no cell was available for reuse and that we should
     *   create a new one.
     */
    if (cell == nil) {

        /* 
         *   Actually create a new cell (with an identifier so that it can be dequeued).   
         */

        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"MyIdentifier"] autorelease];

    }

    /*
     *   Now that we have a cell we can configure it to display the data corresponding to
     *   this row/section
     */

    //Configure the cell here..


    /* Now that the cell is configured we return it to the table view so that it can display it */


    return cell;

}

如果您仍然不清楚,请告诉我。

于 2014-05-01T05:21:47.763 回答
3

它们是不同的东西:

  • cellForItemAtIndexPath从集合视图中获取一个已填充的单元格。
  • dequeueReusableCellWithReuseIdentifier在填充新单元格时,可能会返回一个可以重复使用的单元格。它旨在帮助减少存在的单元格对象的数量。如果它失败(而且它经常会失败),那么必须显式地创建一个新单元。
于 2014-05-01T05:08:22.613 回答