dequeueReusableCellWithReuseIdentifier:和cellForItemAtIndexPath之间的区别:

Pri*_*wal 4 objective-c uikit ios 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..
    }
Run Code Online (Sandbox Code Playgroud)

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

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..
        }
Run Code Online (Sandbox Code Playgroud)

试过这个,但没有用:

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..
        }
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Bur*_*ala 6

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

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

}
Run Code Online (Sandbox Code Playgroud)

如果您还不清楚,请告诉我.