UITableView中两种重用Cell的方法的区别
两个方法如下:
- (nullable __kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier;
- (__kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath;
原本重用Cell只有- (nullable __kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier;
这个方法,在iOS6之后引进了- (__kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath;
这个方法,其实在我们开发过程中,尤其是已经形成自己的代码习惯的情况下,可能这并不是我们关注的点。
首先,我们介绍两个注册Cell的方法,该方法可以在创建tableView的时候调用:
- (void)registerNib:(nullable UINib *)nib forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(5_0);
- (void)registerClass:(nullable Class)cellClass forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);
- (void)registerNib:(nullable UINib *)nib forCellReuseIdentifier:(NSString *)identifier;
含有Xib的Cell用这个方法注册。
- (void)registerClass:(nullable Class)cellClass forCellReuseIdentifier:(NSString *)identifier;
自定义不含Xib的Cell使用这个方法注册。
值得注意的是,当注册了Cell之后,两个重用方法在没有可重用的Cell时会自动创建Cell,也就是说我们可以不写:
if (cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellIdentifier"];
}
或者
if (cell == nil)
cell= [[[NSBundle mainBundle] loadNibNamed:@"TestCell" owner:self options:nil] lastObject];
}
这些创建Cell的方法。
注意,只有当注册了Cell之后,才可以调用- (__kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath;
方法重用,否则程序会奔溃。
但是,- (nullable __kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier;
这个方法无论有没有注册Cell都可以调用,区别只是在于当没有可复用的Cell时,是自己手动创建还是系统自动创建。
总而言之,- (__kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath;
方法是专门针对注册后的Cell的复用使用的。而- (nullable __kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier;
方法是在无论有没有注册的情况都可以调用。而是否注册Cell只是决定你需不需要在没有可以重用的Cell时,新建Cell的事件是由程序员还是系统替你自动生成。