今天在开发过程中用到了UITableView,在对cell进行设置的时候,我发现对UITableViewCell的重用设置的方法有如下两种,刚开始我也不太清楚这两种之间有什么区别。直到我在使用方法二进行重用的时候,具体实现代码如下,其中CJMeetingReplyBasicCell是我自定义的UITableViewCell类型,但是在运行的时候每次都在调用 CJMeetingReplyBasicCell *cell = [tableView dequeueReusableCellWithIdentifier:@"BasicCell" forIndexPath:indexPath]; 时崩溃,通过查找各种原因,确定不是自己代码的问题之后,开始了解这两种重用方法的区别。那么,这两种重用UITableViewCell的方法之间到底有什么区别呢?

//方法一
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];//方法二
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {MeetingReplyBasicCell *cell = [tableView dequeueReusableCellWithIdentifier:@"BasicCell" forIndexPath:indexPath];if (!cell) {cell = [[MeetingReplyBasicCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"BasicCell"];}return cell;
}

一 官网文档解释

  首先我们看一下在iOS源码的UITableView.h中对两者的解释如下,我们可以看到方法二是在iOS 6.0中开始推出的新方法,在对方法二的解释中,我们注意标红的部分的意思是假设我们已经注册了标识符,这里我们猜测可能是我们需要对标识符进行注册。

//UITableView.h
- (nullable __kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier;  // Used by the delegate to acquire an already allocated cell, in lieu of allocating a new one.- (__kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0); // newer dequeue method guarantees a cell is returned and resized properly, assuming identifier is registered

  接下来我们找到官方文档,https://developer.apple.com/documentation/uikit/uitableview/1614878-dequeuereusablecellwithidentifie?language=objc,官方文档对方法二的解释有两点需要注意,第一个是返回值的地方如下图,这里说道该方法总是返回一个有效的UITableViewCell,这是与方法一不同的地方之一。

  第二个需要注意的地方是,在该页面下面有一个Important的提示如下图,该提示就说明了方法二的正确使用方法。这里解释说要先进行注册我们自定义或者通过nib的类和标识符,然后再使用方法二进行重用。所以现在我们崩溃的原因就已经明确了,问题就出在没有进行先注册我们自定义的类和标识符。

二 常规使用方法

  对于这两种方法的常规使用方法,下面进行总结一下。

  首先,对于方法一,使用方法很简单,无需进行其他的定义和注册,代码如下。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {MeetingReplyBasicCell *cell = [tableView dequeueReusableCellWithIdentifier:@"BasicCell"];if (!cell) {cell = [[MeetingReplyBasicCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"BasicCell"];}return cell;
}

  接下来,我们简单使用方法二进行重用,具体步骤代码如下。

//首先,我们再tableview进行配置的时候需要注册我们已定义的cell类和重用标识符
self.tableView.backgroundColor = xxxx;
[self.tableView registerClass:[MeetingReplyBasicCell class] forCellReuseIdentifier:@"BasicCell"];

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {MeetingReplyBasicCell *cell = [tableView dequeueReusableCellWithIdentifier:@"BasicCell" forIndexPath:indexPath];return cell;
}

转载于:https://www.cnblogs.com/mukekeheart/p/8583116.html

iOS学习——UITableViewCell两种重用方法的区别相关推荐

  1. Service 的生命周期;两种启动方法和区别

    1:startService  Service的生命周期:onCreate() --> onStart() -> onDestroy() 停止服务:service.stopService( ...

  2. IOS学习之UISwitch控件两种使用方法和监听

    IOS学习之UISwitch控件两种使用方法和监听 分类: IOS开发入门2012-06-15 11:48 1363人阅读 评论(0) 收藏 举报 一.第一种创建UISwitch控件的方法,在代码中动 ...

  3. JavaSE学习总结(八)常用类(上)Object类==与equals方法的区别浅克隆的特点Scanner类String类String两种创建对象方式的区别String类的各种功能

    JavaSE学习总结(八)常用类(上)/Object类/==与equals方法的区别/浅克隆的特点/Scanner类/String类/String两种创建对象方式的区别/String类的各种功能 常用 ...

  4. html内存占用过大 ios,iOS12系统内存占用高怎么解决 iOS12系统内存占用高的两种解决方法...

    最近很有几位小伙伴表示自己升级至iOS12系统之后,表示系统内存占用非常高,不知道如何清理.其实这个问题不是简单实用那些清理软件可以解决的,那么iOS12系统内存占用高怎么解决?下面小编带来iOS12 ...

  5. (最新react-native-0.59.5) 如何将ReactNative项目集成到现有得Android项目中(两种实现方法之一)

    背景:最近在学习React-Native相关的知识,有个需求,如果已经存在一个成熟的Android 或者 IOS项目,如何实现在后续的开发中用RN来实现部分功能.再此我只是讲解一下Android de ...

  6. mysql workbench kernelbase.dll_电脑出现kernelbase.dll错误的两种解决方法

    KernelBase.dll是Windows操作系统的重要文件,它为各种应用程序提供服务.如果电脑提示kernelbase.dll错误,这该怎么处理?大家可以用电脑自带的防火墙或者是第三方软件来进行故 ...

  7. Java中关于Arrays.sort的两种重载方法的理解

    前言 在java中重载排序方法的方法目前有两种,一种是实现Comparable接口的compareTo方法,还有一种是用比较器(comparator) 作为参数,其中比较器是实现了Comparator ...

  8. 链表反转的两种实现方法,后一种击败了100%的用户!

    作者 | 王磊 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) 链表反转是一道很基础但又非常热门的算法面试题,它也在<剑指Offer> ...

  9. 链表反转的两种实现方法,后一种击败了100%的用户

    作者 | 王磊 来源 | Java中文社群(ID:javacn666) 头图 |  CSDN 下载自东方IC 链表反转是一道很基础但又非常热门的算法面试题,它也在<剑指Offer>的第 2 ...

最新文章

  1. 题目1483:求最大最小数
  2. qt自定义插件creator不显示_让Qt Creator更懂我们的自定义模块
  3. HDU1010:Tempter of the Bone(dfs+剪枝)
  4. 晒晒女儿学国画一学期的成果
  5. apache kafka_2018年机器学习趋势与Apache Kafka生态系统相结合
  6. 1. Windows Powershell初接触
  7. java星号心形代码_肿么用JAVA打印出心形的图案
  8. Top Down Operator Precedence - 自顶向下算符优先分析法
  9. c语言sqrt函数无作用,如何在不使用C语言的sqrt函数的情况下获得数字的平方根...
  10. 排错-通过LLDP信息查找环路(以H3C S5100为例)
  11. vs2019,C#,MySQL创建图书管理系统2(登录功能实现)
  12. Python 程序员过中秋Python+pygame 制作拼图小游戏(附源码:5源码)
  13. xcode和macos对应版本参考
  14. torch.mul torch.bmm
  15. Matlab绘制特殊图形------直方图
  16. 一文带你了解UI自动化测试框架
  17. (Sentinel-2A、Sentinel-2B)2017年全年中国地区数据
  18. Newtonsoft.Json.dll使用
  19. 调用二级页面的html代码,从一级页面直接调用二级页面中的iframe框架
  20. Jenkins-springcloud项目打包并上传docker仓库

热门文章

  1. 【重识 HTML + CSS】官方文档的阅读
  2. 【小型JavaFx项目】英汉词典
  3. 【南邮操作系统实验】银行家算法Java版
  4. pom模块依赖关系梳理
  5. Linux修改history存储的最大记录数
  6. [转]Hexo博客插入自定义不渲染页面
  7. 再复杂的报表,用这3种方式,都能解决!
  8. 报表性能优化方案之单数据集分页SQL实现层式报表
  9. java 装饰流_java装饰流的使用【转】
  10. 钉钉小程序使用vant_高效钉钉小程序开发丨详解Hello,dingtalk