我一直想知道为什么我的代码可以很好地工作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..
}
有任何想法吗?
这两种基本上是两种截然不同的方法。
-
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;
}
如果您仍然不清楚,请告诉我。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)