问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

用什么方法鉴别cell是否重用

发布网友 发布时间:2023-05-15 12:23

我来回答

1个回答

热心网友 时间:2024-12-05 06:20

UITableView中有两种重用Cell的方法:
Ios代码
- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier;
- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0);

在iOS 6中dequeueReusableCellWithIdentifier:被dequeueReusableCellWithIdentifier:forIndexPath:所取代。如此一来,在表格视图中创建并添加UITableViewCell对象会变得更为精简而流畅。而且使用dequeueReusableCellWithIdentifier:forIndexPath:一定会返回cell,系统在默认没有cell可复用的时候会自动创建一个新的cell出来。

使用dequeueReusableCellWithIdentifier:forIndexPath:的话,必须和下面的两个配套方法配合起来使用:
Ios代码
// Beginning in iOS 6, clients can register a nib or class for each cell.
// If all reuse identifiers are registered, use the newer -dequeueReusableCellWithIdentifier:forIndexPath: to guarantee that a cell instance is returned.
// Instances returned from the new dequeue method will also be properly sized when they are returned.
- (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(5_0);
- (void)registerClass:(Class)cellClass forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);

1、如果是用NIB自定义了一个Cell,那么就调用registerNib:forCellReuseIdentifier:
2、如果是用代码自定义了一个Cell,那么就调用registerClass:forCellReuseIdentifier:

以上这两个方法可以在创建UITableView的时候进行调用。

这样在tableView:cellForRowAtIndexPath:方法中就可以省掉下面这些代码:
Ios代码
static NSString *CellIdentifier = @"Cell";
if (cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

取而代之的是下面这句代码:
Ios代码
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

一、使用NIB
1、xib中指定cell的Class为自定义cell的类型(不是设置File's Owner的Class)
2、调用registerNib:forCellReuseIdentifier:向数据源注册cell
Ios代码
[_tableView registerNib:[UINib nibWithNibName:@"CustomCell" bundle:nil] forCellReuseIdentifier:kCellIdentify];
3、在tableView:cellForRowAtIndexPath:中使用dequeueReusableCellWithIdentifier:forIndexPath:获取重用的cell,如果没有重用的cell,将自动使用提供的nib文件创建cell并返回(如果使用dequeueReusableCellWithIdentifier:需要判断返回的是否为空)
Ios代码
CustomCell *cell = [_tableView dequeueReusableCellWithIdentifier:kCellIdentify forIndexPath:indexPath];
4、获取cell时如果没有可重用cell,将创建新的cell并调用其中的awakeFromNib方法

二、不使用NIB
1、重写自定义cell的initWithStyle:withReuseableCellIdentifier:方法进行布局
2、注册cell
Ios代码
[_tableView registerClass:[CustomCell class] forCellReuseIdentifier:kCellIdentify];
3、在tableView:cellForRowAtIndexPath:中使用dequeueReusableCellWithIdentifier:forIndexPath:获取重用的cell,如果没有重用的cell,将自动使用提供的class类创建cell并返回
Ios代码
CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellIdentify forIndexPath:indexPath];
4、获取cell时如果没有可重用的cell,将调用cell中的initWithStyle:withReuseableCellIdentifier:方法创建新的cell
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
绿茶要猛冲吗,绿茶鲜嫩不需要(绿茶冲泡的正确方式) 绿茶为什么越好越不耐泡 绿茶要泡几泡?哪种绿茶最耐泡? 哪种绿茶最耐泡 职场故事:美女职员遇到暴躁老板 老板脾气坏得要命,我该怎么办 老板老爱发脾气,我们应该怎么做呀? 害怕老总发脾气怎么办 网络上用名字测和另一个人的关系准确吗 一个男生把自己的名字和另一个人的名字放在一起,中间放个"&"符号... reuseable还是reusable 玉米里掰出来一个小玉米能吃吗 课堂上写作文慢怎么办 语文试卷写的慢怎么办 语文作业写得很慢怎么提速? 成考成绩什么时候公布 成人高考考完后成绩在多久会公布? 二级建造师分省份吗 哪里考就只能在那里用吗 二级建造师分省份么 必须在本省考吗 万科链家装饰龙和小区装修的要点 找链家房产中介出租装修可靠吗 链家帮忙装修卖房利弊 4s店说的车身胶指的什么东西 手机主板不封胶 北京s2线人多吗 北京市郊铁路s2线怎么购票 梦见爸爸没借钱给别人的预兆 梦见自己不借钱给别人 请问用什么资源编辑器可以打开MUI资源文件啊? 写动物的好句子摘抄 宝马6500代金券买什么划算 鄂h是湖北哪个城市车牌号 挫伤的网络解释挫伤的网络解释是什么 养老保险帮别人确认出现计费异常怎么办 灵活就业的养老保险日期选择了怎么老是系统异常 曼戈途激光笔多远 秘书需要具备的能力简述 拼多多寄快递时忘了拍单号怎样查询? 资金占用费6%可以抵扣吗 椟栌的成语椟栌的成语是什么 _楔的成语_楔的成语是什么 小学生孔子学本好词好句 ...等疾病在年轻人中已不鲜见,出现低龄化趋势,什么原因会导致耳病... 现代中医有的认为耳病多由肝、脾、肾三脏之虚实引发? ...因为人体的脾胃、肝肾等脏腑就形成了耳病发生的条件? Share Shared Sharing的词义和具体区别. 如题. 以下三个单词的词义如何区分,各单词用于哪些情形? shared和sharing用哪个比较好!会英语的朋友进来啊! sharedfuture为什么不用sharing 水循环中央空调末端多久排一次空气