我一直想知道为什么我的代码适用于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..
}
有什么想法吗?
答案 0 :(得分:6)
这两个基本上是两种截然不同的方法。
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;
}
如果你还不清楚,请告诉我。
答案 1 :(得分:3)
他们是不同的东西:
cellForItemAtIndexPath
从集合视图中获取已填充的单元格。dequeueReusableCellWithReuseIdentifier
将可能返回可重复使用的单元格。它旨在帮助减少现有的细胞对象的数量。如果失败(通常会失败),则必须明确创建新单元格。