dequeueReusableCellWithReuseIdentifier:和cellForItemAtIndexPath之间的区别:

时间:2014-05-01 04:58:01

标签: ios objective-c uikit uicollectionview uicollectionreusableview

我一直想知道为什么我的代码适用于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..
        }

有什么想法吗?

2 个答案:

答案 0 :(得分:6)

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

  1. dequeReusableCellWithReuseIdentifier: 假设您有要查看的文章列表。假设你有50篇文章。屏幕不会同时在屏幕上显示所有50篇文章。它将根据您给行的高度一次显示有限的单元格。让我们说屏幕一次只显示5篇文章,现在你位于列表的顶部。该列表将显示1-5项。现在滚动时,为了显示第6个项目,列表会重新使用第1个单元格,将其配置为第6个单元格并显示它。到这时你的第一个单元格已不在视野中了。
  2. 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;
    
    }
    

    如果你还不清楚,请告诉我。

答案 1 :(得分:3)

他们是不同的东西:

  • cellForItemAtIndexPath从集合视图中获取已填充的单元格。
  • 在填充新单元格时,
  • dequeueReusableCellWithReuseIdentifier可能返回可重复使用的单元格。它旨在帮助减少现有的细胞对象的数量。如果失败(通常会失败),则必须明确创建新单元格。