關(guān)于注冊
- (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);
兩種方式 xib cellClass
關(guān)于緩存提取
- (nullable __kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier; //ios2.0
- (__kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0);
兩種方式 一個帶indesPath 一個不帶 比較直觀
關(guān)于測試
test1 不進(jìn)行注冊
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellId"];//提取方式一
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellId" forIndexPath:indexPath];//提取方式二
return cell;
}
控制臺打印結(jié)果:
提取方式一:
cell為nil 報錯:未能提取到一個cell
reason: 'UITableView (<UITableView: 0x7f85c3016000; frame = (0 0; 375 667); clipsToBounds = YES; gestureRecognizers = <NSArray: 0x608000240a50>; layer = <CALayer: 0x608000029620>; contentOffset: {0, 0}; contentSize: {375, 440}>) failed to obtain a cell from its dataSource (<ViewController: 0x7f85c1607630>)'
提取方式二:
cell壓根沒返回 直接報錯:讓你必須先去注冊一個cell
reason: 'unable to dequeue a cell with identifier cellId - must register a nib or a class for the identifier or connect a prototype cell in a storyboard'
解決(不進(jìn)行提前注冊前提):
采用方式一進(jìn)行提取 可以在后面加上判斷cell 是否為nil 然后進(jìn)行創(chuàng)建 采用方案二 無解
if (!cell) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cellId"];
}
test2 進(jìn)行注冊
//[tableV registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cellId"]; //注冊
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellId"];//提取方式一
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellId" forIndexPath:indexPath];//提取方式二
return cell;
}
控制臺打印結(jié)果:
提取方式一:無報錯
提取方式二:無報錯
兩種提取方式都可以
官方:
regis... 注冊一個類用來創(chuàng)建
dequeueReusable... 從緩存中提取一個cell 如果沒有 則會以注冊的cell為標(biāo)準(zhǔn)創(chuàng)建新的cell 添加到表中 兩種提取方式都會這樣做
總結(jié):
使用 dequeueReusableCellWithIdentifier:@"cellId" 這種方式提取 要么加判斷 要么進(jìn)行提前注冊
使用 dequeueReusableCellWithIdentifier:@"cellId" forIndexPath:indexPath 這種方式提取 只能提前注冊