【iOS】UITableView总结(Cell的复用原理、自定义Cell、UITableViewCell协议方法)

UITableView

列表的特点:

  • 数据量大
  • 样式较为统一
  • 通常需要分组
  • 垂直滚动
  • 通常可视区只有一个 -> 视图的复用

在这里插入图片描述

UITableViewDataSource

UITableView作为视图,只负责展示,协助管理,不管理数据

需要开发者为UITableView提供展示所需要的数据及Cell

通过delegate的模式,开发者需要实现UITableViewDataSource

  • @require
    • numberOfRowsInSection:(NSInteger)section;
    • cellForRowAtIndexPath:(NSIndexPath *)indexPath;

UITableViewCell默认提供的样式

请添加图片描述

都是常用的cell布局

UITableViewCell的复用及其原理

//每当滚动tableView有cell要进入可视区时,系统都会自动回调此dataSource方法
- (nonnull UITableViewCell *)tableView:(nonnull UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath {UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier: @"id"];if (!cell) {cell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: @"id"];count++;}cell.textLabel.text = [NSString stringWithFormat: @"主标题 - %@", @(indexPath.row)];cell.detailTextLabel.text = @"副标题";cell.imageView.image = [UIImage imageNamed: @"image.png"];return cell;
}- (NSInteger)tableView:(nonnull UITableView *)tableView numberOfRowsInSection:(NSInteger)section {return 66;
}

当你需要66个cell来展示数据时,而可视区至多显示13个cell,开始cell为空,系统会先创建13个cell并设置自定义的id做标记,滑动tableView,滑出可视区的cell系统会将其放入cell回收池,划入可视区的cell是根据id从回收池取出的同类型的cell来进行复用

在这里插入图片描述

因此本质上系统只需创建了13个cell,这样极大地减少了内存消耗,提高了程序性能

在这里插入图片描述

以上是cell复用的方法需要对cell进行判空,接下来介绍一种不需要判空的方法——cell的注册机制

// 在viewDidLoad初始化方法中进行注册
[tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"id"];// 在dataSource协议方法中获取已注册的单元格cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"id" forIndexPath:indexPath];

在使用注册机制后,就可以在dataSource方法中通过标识符快速复用已注册的cell,而且在cell为空时会自动利用注册cell时提供的类创建一个新的cell并返回,而无需手动创建和管理每个cell实例

自定义Cell

【iOS】自定义Cell

demo

UITableViewDemo on GitHub

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/144699.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FPGA【紫光语法】

寄存器数据类型: reg 默认为 1 bit wide,如果超过 1 bit,则需要 range declaration 设置 reg 的位宽integer 默认位宽为 32 bit,不允许有 range declarationtime 默认位宽为 64 bit,不允许有 range declarat…

.net6部署到linux上(CentOS Linux 7)

目录 一、先在linux上配置.net环境 添加 Microsoft 包存储库 安装 SDK 安装运行时 检查 SDK 版本可使用终端查看当前安装的 .NET SDK 版本。 打开终端并运行以下命令。 二、创建.net6 mvc项目 并发布 创建项目 修改默认端口 打包发布到文件夹 运行打包项目查看项目是否…

非平稳信号分析和处理、STFT的瞬时频率研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Android Studio快速实现Flutter应用的国际化和多语言支持

文章目录 Flutter实现国际化和多语言支持添加依赖库Android Studio 安装flutter Intl插件项目初始化增加语言app中使用国际化在应用中切换语言:运行应用 总结easy_localization 插件intl 包Flutter GetX 包flutter_i18n 插件JSON 文件 Flutter实现国际化和多语言支持…

【C语言】每日一题(旋转数组)

旋转数组,链接奉上 目录 方法:创建额外的数组:整体思路:代码实现: 数组反转:整体思路:代码实现:小插曲: 方法: 创建额外的数组: 整体思路: 创建一个额外的…

【试题038】 逻辑与和赋值表达式例题

1.题目:设int n;,执行表达式(n2)&&(n1)&&(n0)后,n的值是? 2.代码分析: //设int n;,执行表达式(n2)&&(n1)&&(n0)后,n的值是? int main() {int n;printf("…

Android前台服务和通知

前台服务 Android 13及以上系统需要动态获取通知权限。 //android 13及以上系统动态获取通知权限 if (Build.VERSION.SDK_INT > Build.VERSION_CODES.Q) {checkPostNotificationPermission(); } private void checkPostNotificationPermission() {if (ActivityCompat.chec…

STM32-LTC6804方案成熟BMS方案

方案下载链接!!https://mp.weixin.qq.com/s?__bizMzU2OTc4ODA4OA&mid2247549092&idx1&snc73855c4e3d5afddd8608d8528864f95&chksmfcfb1373cb8c9a65a4bd1f545a1a587af882f209e7ccbb8944f4d2514d241ca1d7fcc4615e10&token539106225&a…

JUC并发编程笔记2

省流: 自己笔记,划走~~~~ 缓存更新策略

spring配置文件第一行导致读取配置失败

遇到读取配置存在问题,尤其当配置到第一行 通过spring执行测试类,没有问题,但是相同配置启动项目时,老找不到JdbcTemplate 使用配置: spring.shardingsphere.datasource.namesmaster,slavespring.shardingsphere.dat…

qt 读取txt文本内容时,中文乱码

项目场景: 项目中,需要在TF卡中做类似txt阅读器的功能,因为app是在嵌入式系统下运行的,发现当读取txt的文本格式为ANSI时,中文的显示是乱码,故记录下解决方法 问题解决 中文乱码问题还是涉及到编码问题&…

【C++】继承 ⑦ ( 继承中的对象模型分析 | 继承中的构造函数和析构函数 )

文章目录 一、继承中的对象模型分析1、继承代码示例2、基类与派生类内存模型3、问题引入 - 派生类对象构造函数和析构函数调用4、完整代码示例 - 派生类对象内存模型 二、继承中的构造函数和析构函数1、子类构造函数与析构函数调用顺序2、子类构造函数参数列表3、代码示例 - 继…