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

news/2024/7/20 21:15:08 标签: ios, objective-c

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.niftyadmin.cn/n/5111336.html

相关文章

快乐数(C++解法)

题目 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1&…

​CUDA学习笔记(五)GPU架构

本篇博文转载于https://www.cnblogs.com/1024incn/tag/CUDA/,仅用于学习。 GPU架构 SM(Streaming Multiprocessors)是GPU架构中非常重要的部分,GPU硬件的并行性就是由SM决定的。 以Fermi架构为例,其包含以下主要组成…

Maven在开发中的使用及理解

在JAVA项目中,我们通常需要对项目的构建和依赖进行管理,这个时候我们就需要MAVEN来对项目进行支持。 一.MAVEN构建 在整个MAVEN构建的过程中包含以下环节,也对应IDEA中MAVEN的对应功能。 清理Maven Clean 清理,则代表删除上一…

Element Plus el-form表单自定义插槽如何使用

//正常无插槽表单<el-form :model"form" label-width"120px"><el-form-item label"Activity name"><el-input v-model"form.name" /></el-form-item></el-form>//带插槽表单//适用二次封装的form组件&l…

Qt 目录操作(QDir 类)及展示系统文件实战 QFilelnfo 类介绍和获取文件属性项目实战

一、目录操作(QDir 类) QDir 类提供访问系统目录结构 QDir 类提供对目录结构及其内容的访问。QDir 用于操作路径名、访问有关路径和文件的信息以及操作底层文件系统。它还可以用于访问 Qt 的资源系统 Qt 使用“/”作为通用目录分隔符&#xff0c;与“/”在 URL 中用作路径分…

(未完待续)【Netty专题】Netty实战与核心组件详解

目录 前言阅读对象阅读导航前置知识课程内容一、Netty简介1.1 Netty是什么1.2 Netty有什么优势 二、第一个Netty程序2.1 Netty简单使用示例2.2 代码解读2.3 Netty的特性2.3.1 Netty的事件 2.4 Netty线程模型 三、Netty核心组件详解&#xff08;未完待续&#xff09;3.1 EventLo…

[翻译]理解Postgres的IOPS:为什么数据即使都在内存,IOPS也非常重要

理解Postgres的IOPS&#xff1a;为什么数据即使都在内存&#xff0c;IOPS也非常重要 磁盘IOPS&#xff08;每秒输入/输出操作数&#xff09;是衡量磁盘系统性能的关键指标。代表每秒可以执行的读写操作数量。对于严重依赖于磁盘访问的PG来说&#xff0c;了解和优化磁盘IOPS对实…

QT学习day5(QT实现TCP协议)

作业&#xff1a;利用TCP客户端和服务器实现网络聊天室&#xff08;简单版QQ&#xff09; 1.服务器代码 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTcpServer> //服务器头文件 #include<QTcpSocket> …