专栏首页mukekeheart的iOS之旅iOS学习——UITableViewCell两种重用方法的区别

iOS学习——UITableViewCell两种重用方法的区别

  今天在开发过程中用到了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;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • iOS学习--NSObject详解

    官方对于NSObject的解释如下: The root class of most Objective-C class hierarchies, from wh...

    mukekeheart
  • No.016 3Sum Closest

    16. 3Sum Closest Total Accepted: 86565 Total Submissions: 291260 Difficulty: Med...

    mukekeheart
  • OC学习9——反射机制

    1、OC提供了3种编程方式与运行环境进行交互: 直接通过OC的源代码:这是最常见的方式,开发人员只是编写OC源代码,而运行环境负责在后台工作。 通过NSObje...

    mukekeheart
  • Swift - 给TableView添加编辑功能(删除,插入)

    1,下面的样例是给表格UITableView添加编辑功能: (1)给表格添加长按功能,长按后表格进入编辑状态 (2)在编辑状态下,第一个分组处于删除状态,第...

    Python疯子
  • Linux内核之旅/张凯捷——系统调用分析(1)

    In computing, a system call is the programmatic way in which a computer program ...

    Linux阅码场
  • 地震信号的一些基本概念

    可控震源是指通过一个与大地紧密耦合的振动平板,以反作用方式向地下传送一组连续振动的弹性波信号(又称扫描信号),再经过对地面接收到的反射波信号的处理和辨识,用于解...

    DSPSTACK.COM
  • 目录 第1章 = new 图说小程序(思维导图);

    写在前面: 本来想写一本关于小程序的书,后来各种原因又放弃了,目录和第一章都基本写完了。不能埋没了我写的东西,见见光。哈哈。 第1章认识小程序 “微信之父”张小...

    java思维导图
  • 快速学习Shiro-Shiro在SpringBoot工程的应用

    Apache Shiro是一个功能强大、灵活的,开源的安全框架。它可以干净利落地处理身份验证、授权、企业会话管理和加密。越来越多的企业使用Shiro作为项目的安...

    cwl_java
  • 微信公众平台自定义菜单新增扫一扫、发图片、发位置 LBS运作更便捷

      今天微信公众平台发布更新,自定义菜单新增扫一扫、发图片、发送位置等功能,这对于有意挖掘微信LBS服务的运营者来说更便捷了,订阅号不用返回微信界面就能扫图、发...

    ytkah
  • 如何在Azkaban中安装HDFS插件以及与CDH集成

    前面Fayson介绍了《如何编译安装Azkaban服务》和《如何编译Azkaban插件》,本篇文章主要介绍如何在Azkaban中安装HDFS插件以及与CDH集群...

    Fayson

扫码关注云+社区

领取腾讯云代金券