一、dequeueReusableCellWithReuseIdentifier 走的是对应的cell什么创建方法?
初步猜测是跟注册方式有关
如果有关UINib * hotCityNib=[UINibnibWithNibName:@"HotCityCell"bundle:nil];
[self.collectionViewregisterNib:hotCityNib forCellWithReuseIdentifier:COLLECT_CELL_ID];
那么对应的是是cell的awakefromXib的创建方法
如果有关[collection registerClass:[UICollectionCell class]forCellWithReuseIdentifier:cellIdentifier];
那么对应的是cell的initwithframe的创建方法
二、UICollectionView使用的cell重用机制
1.首先服从<UICollectionViewDataSource>协议,如果自定义cell,导入自定义cell类的头文件
2.定义全局变量重用标识符
static NSString *cellIdentifier = @“重用”;
3.注册cell(collection,为UICollectionView对象)
[collection registerClass:[UICollectionCell class] forCellWithReuseIdentifier:cellIdentifier];
4.创建cell
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
//使用自定义cell,用自定义cell类将UICollectionCell替换即可
UICollectionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
return cell;
}
而tableviewcell 出了上面之外 有单独的创建方法
(3).判断是否成功取到可重用的cell,如果没有创建一个cell
if (!cell) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier: identifier] ;
} return cell;}
三.两种cell复用的方法区别:
假设我们已经创建了一个collectionView,下面的1和2到底有什么区别呢
define COLLECT_CELL_ID @"collectionCellId"
1.[self.collectionView dequeueReusableCellWithReuseIdentifier:COLLECT_CELL_ID];
2.[self.collectionView dequeueReusableCellWithReuseIdentifier:COLLECT_HOTCITY_CELL_ID forIndexPath:indexPath];
对于这两个方法,看了苹果的官方文档,给出的答案是这样的(以XIB创建的cell为例)
对于第二种方式,必须用注册的方法来实现,即实现
UINib * hotCityNib=[UINibnibWithNibName:@"HotCityCell"bundle:nil];
[self.collectionViewregisterNib:hotCityNib forCellWithReuseIdentifier:COLLECT_CELL_ID];
否则会导致程序崩溃。
对于第一种方式,则使用普通方法和注册方法都可以。
但是到了这里,肯定还是有人会问,到底根本上的区别在哪里呢,经过多方查阅以及自己进行实验,终于发现了,原来使用第二种方法在出列cell之前会再次调用 sizeForItemAtIndexPath (tableView中为 heightForRowAtIndexPath)方法