UITableView regis... dequeueReusable... 相关

关于注册

- (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

关于缓存提取

- (nullable __kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier;  //ios2.0
- (__kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0);

两种方式 一个带indesPath 一个不带 比较直观

关于测试

test1 不进行注册

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellId"];//提取方式一
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellId" forIndexPath:indexPath];//提取方式二
    return cell;
}
控制台打印结果:
提取方式一:
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'

解决(不进行提前注册前提):
采用方式一进行提取  可以在后面加上判断cell 是否为nil  然后进行创建   采用方案二 无解
 if (!cell) {
    cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cellId"];
 }

test2 进行注册

//[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;
}
控制台打印结果:
提取方式一:无报错
提取方式二:无报错
两种提取方式都可以

官方:
regis... 注册一个类用来创建
dequeueReusable... 从缓存中提取一个cell 如果没有 则会以注册的cell为标准创建新的cell 添加到表中 两种提取方式都会这样做

总结:
使用 dequeueReusableCellWithIdentifier:@"cellId" 这种方式提取 要么加判断 要么进行提前注册
使用 dequeueReusableCellWithIdentifier:@"cellId" forIndexPath:indexPath 这种方式提取 只能提前注册

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容