「iOS」自定义cell与cell的复用

iOS学习

  • 前言
  • 一:TableView协议
  • 二:cell的复用
  • Cell的复用原理
  • 自定义cell
  • 总结

前言

UITableView是iOS开发中不可或缺的一部分,它是苹果iOS SDK提供的一种用于展示数据列表的视图控件。我们对其中的cell进行自定义,即可得到我们需要的UI界面

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath3.选择行的方法,didSelectRowAtIndexPath- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath4.删除行的方法 :-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

一:TableView协议

创建一个TableView我们首先需要加入<UITableViewDelegate,UITableViewDataSource>协议。其中UITableViewDataSource协议用来设置cell的行数列数。UITableViewDelegate协议用来设置cell的相关高度。
随后在.m文件中将TbaleView的委托对象和数据源对象设为自己。

    _tableView.delegate = self;_tableView.dataSource = self;

必须要实现的方法有如下几种:

//分区的行数
- (NSInteger)tableView:(nonnull UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 行数;
}
//列数
-(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView
{return 分区数;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{return 单元格高度;
}
//单元格样式,也是自定义cell需要修改的地方。
-(UITableViewCell*)tableView:(UITableView *)tableView 
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{NSString *str = @"cell";UITableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier:str];if (cell == nil) {cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:str];}    return cell;}

剩余功能在项目中总结。

二:cell的复用

cell的复用方式有两种,注册和非注册,此处给出代码来区分二者。
注册:

//注册
- (void)viewDidLoad 
{[super viewDidLoad];//使用Nib注册cell[self.tableView registerNib:[UINib nibWithNibName:@"CustomCell" bundle:nil] forCellReuseIdentifier:@"myCell"];// 使用代码注册cell[self.tableView registerClass:[CustomCell class] forCellReuseIdentifier:@"myCell"];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{NSString *identif = @"mycell";UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];return cell;
}

非注册:

- (void)viewDidLoad 
{[super viewDidLoad];
}
-(UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{NSString *str = @"cell";UITableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier:str];if (cell == nil) {cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:str];}return cell;
}

注册与非注册相比,需要在viewDidLoad中先对cell类进行注册,并且在其后的使用中不需要判空。
这是因为通过注册方法(如registerClass:forCellReuseIdentifier:或registerNib:forCellReuseIdentifier:)将指定的单元格类或Nib文件与标识符关联起来。通俗来讲,即表格视图已经知道要用哪个cell。
而在非注册的方式中,表格视图并不知道需要使用哪个单元格类或Nib文件。因此每次使用前都需要进行判空操作,这是必要的。

Cell的复用原理

iOS内部使用了三个容器 _cachedCells, availableCells, _reusableCells 完成了 Cell 的复用。

  1. cachedCells:为NSMutableDictionary 类, 是一个缓存容器,用于存储表格视图中的已创建的单元格对象。每个单元格对象都与其对应的重用标识符相对应。当表格视图需要显示某个单元格时,会首先在_cachedCells 中查找是否有可复用的单元格对象,如果有则直接使用,否则才会创建新的单元格对象。
  2. reusableCells: 为NSMutableDictionary ,是一个重用单元格的缓存容器,用于存储可供重用的单元格对象。
  3. availableCells: 类型:NSMutableArray,是一个可用单元格的缓冲池,用于存储当前可用的、已显示在表格视图中的单元格对象。当单元格滚出屏幕时,会被移动到availableCells 中等待复用。这样,在需要显示新的单元格时,可以首先尝试从 availableCells中获取可复用的单元格对象,而不是每次都创建新的单元格。

重用优先级是先检查 reusableCells,然后才是 cachedCells 中的缓存。
简而言之,一开始出现的单元格和与其对应的键值对indexPath储存在cachedCells中。拷贝一份到availableCells中,当有单元格出现在视图时,先检查reusableCells中有没有可以复用的单元格,没有则新建一个单元格,并把顶部划出视图的单元格加入进reusableCells。


自定义cell

先给出效果:
请添加图片描述
其中的每一栏就是一个自定义cell,下面给出实现方法:
创建一个继承与UITableViewCell的myCell。

@interface myCell : UITableViewCell
@property (nonatomic, strong) UIButton *Btn;
@property (nonatomic, strong) UILabel *label1;
@property (nonatomic, strong) UIImageView * imageView1;@end

然后在.m文件中,我们改写两个方法:

-(instancetype) initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];_imageView1 = [[UIImageView alloc] initWithFrame:CGRectMake(10, 10, 20, 20)];_imageView1.image = [UIImage imageNamed:@"头像.jpeg"];[self.contentView addSubview:_imageView1];[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveNotice:) name:@"notice" object:nil];_label1 = [[UILabel alloc] init];_label1.text = @"笙";_label1.textColor = [UIColor blackColor];_label1.backgroundColor = [UIColor clearColor];_label1.font = [UIFont systemFontOfSize:25];[self.contentView addSubview:_label1];return self;
}-(void)layoutSubviews
{[super layoutSubviews];CGFloat screenWidth = UIScreen.mainScreen.bounds.size.width;_label1.frame = CGRectMake(100, 10, screenWidth, 90);_imageView1.frame = CGRectMake(10, 10, 80, 80);
}
@end

其中:-(instancetype) initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{方法是修改cell的样式
-(void)layoutSubviews是修改布局视图。
我们还可以根据index的不同分区列,在同一分区创建不同的的cell。这点在后续的博客中会记录。

总结

以上就是笔者学习的自定义cell和cell的复用有关内容,多写代码,不断遇到bug,才会有更深入的理解。

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

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

相关文章

Python 实现股票指标计算——BBI

BBI (Bull And Bear lndex) - 多空指标 1 公式 3日均价 3日收盘价之和 / 36日均价 6日收盘价之和 / 612日均价 12日收盘价之和 / 1224日均价 24日收盘价之和 / 24BBI (3日均价 6日均价 12日均价 24日均价) / 4 2 数据准备 我们以科创50指数 000688 为例&#xff0c…

Qt 学习第一天:安装VS和Qt

本人更换了一台新的电脑&#xff0c;使用联想电脑管家传输文件后没有安装VS&#xff0c;导致出现了以下问题&#xff1a; 疯狂查资料问人。弄了一个晚上加上午一个多小时之后&#xff0c;还是决定删掉原来的文件夹&#xff0c;重新下载一个 一、安装VS&#xff08;Visual Stud…

算法项目报告:物流中的最短路径问题

问题描述 物流问题 有一个物流公司需要从起点A到终点B进行货物运输&#xff0c;在运输过程中&#xff0c;该公司需要途径多个不同的城市&#xff0c;并且在每个城市中都有一个配送站点。为了最大程度地降低运输成本和时间&#xff0c;该公司需要确定经过哪些配送站点&#xff…

Android:requestLayout、invalidate 和 postInvalidate 的区别

提醒&#xff1a;下面源码来自SDK里Android-34版本 一、requestLayout 点击查看requestLayout官网文档 1.1 requestLayout方法源码 /*** Call this when something has changed which has invalidated the* layout of this view. This will schedule a layout pass of the v…

C++ :友元类

友元类的概念和使用 (1)将类A声明为B中的friend class后&#xff0c;则A中所有成员函数都成为类B的友元函数了 (2)代码实战&#xff1a;友元类的定义和使用友元类是单向的 (3)友元类是单向的&#xff0c;代码实战验证 互为友元类 (1)2个类可以互为友元类&#xff0c;代码实战…

【LeetCode】二叉树的最大深度

目录 一、题目二、解法完整代码 一、题目 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3 示例 2&#x…

Leetcode2160. 拆分数位后四位数字的最小和:

问题描述&#xff1a; 给你一个四位 正 整数 num 。请你使用 num 中的 数位 &#xff0c;将 num 拆成两个新的整数 new1 和 new2 。new1 和 new2 中可以有 前导 0 &#xff0c;且 num 中 所有 数位都必须使用。 比方说&#xff0c;给你 num 2932 &#xff0c;你拥有的数位包括…

怎么剪辑音频文件?4款适合新的音频剪辑软件

是谁还不会音频剪辑&#xff1f;无论是个人音乐爱好者&#xff0c;还是专业音频工作者&#xff0c;我们都希望能找到一款操作简便、功能强大且稳定可靠的音频剪辑工具。今天&#xff0c;我就要为大家带来四款热门音频剪辑软件的体验感分享。 一、福昕音频剪辑 福昕音频剪辑是…

YOLO 模型基础入门及官方示例演示

文章目录 Github官网简介模式数据集Python 环境Conda 环境Docker 环境部署 CPU 版本官方 CLI 示例官方 Python 示例 任务目标检测姿势估计图像分类 Ultralytics HUB视频流示例 Github https://github.com/ultralytics/ultralytics 官网 https://docs.ultralytics.com/zhhttp…

【IEEE出版】第四届能源工程与电力系统国际学术会议(EEPS 2024)

第四届能源工程与电力系统国际学术会议&#xff08;EEPS 2024&#xff09; 2024 4th International Conference on Energy Engineering and Power Systems 重要信息 大会官网&#xff1a;www.iceeps.com 大会时间&#xff1a;2024年8月9-11日 大会…

2024年7月萤火虫航天为NASA发射8颗立方体卫星

作为美国宇航局立方体卫星发射计划的一部分&#xff0c;萤火虫航空航天公司于7月3日在该公司的阿尔法火箭上发射了八颗小型卫星。这枚名为“夏日噪音”的火箭于太平洋夏令时&#xff08;PDT&#xff09;晚上9点04分从加利福尼亚州范登堡空军基地的2号航天发射场成功升空。 立方…

解读vue3源码-响应式篇2

提示&#xff1a;看到我 请让我滚去学习 文章目录 vue3源码剖析reactivereactive使用proxy代理一个对象1.首先我们会走isObject(target)判断&#xff0c;我们reactive全家桶仅对对象类型有效&#xff08;对象、数组和 Map、Set 这样的集合类型&#xff09;&#xff0c;而对 str…

【数学建模】多波束测线问题(持续更新)

多波束测线问题 问题 1建立模型覆盖宽度海水深度重叠长度重叠率 问题二问题三问题四 问题 1 与测线方向垂直的平面和海底坡面的交线构成一条与水平面夹角为 α \alpha α的斜线&#xff08;如下图&#xff09;&#xff0c;称 α \alpha α为坡度。请建立多波束测深的覆盖宽度及…

Python代码,强化学习,深度学习

python代码编写&#xff0c;Python算法设计&#xff0c;强化学习优化&#xff0c;改进模型&#xff0c;训练模型&#xff0c;测试模型&#xff0c;可视化绘制&#xff0c;代编运行结果&#xff0c;交互多模型改进&#xff0c;预测模型&#xff0c;算法修改&#xff0c;Python包…

11.斑马纹列表 为没有文本的链接设置样式

斑马纹列表 创建一个背景色交替的条纹列表。 使用 :nth-child(odd) 或 :nth-child(even) 伪类选择器,根据元素在一组兄弟元素中的位置,对匹配的元素应用不同的 background-color。 💡 提示:你可以用它对其他 HTML 元素应用不同的样式,如 <div>、<tr>、<p&g…

利用PyTorch进行模型量化

利用PyTorch进行模型量化 目录 利用PyTorch进行模型量化 一、模型量化概述 1.为什么需要模型量化&#xff1f; 2.模型量化的挑战 二、使用PyTorch进行模型量化 1.PyTorch的量化优势 2.准备工作 3.选择要量化的模型 4.量化前的准备工作 三、PyTorch的量化工具包 1.介…

openGauss学习笔记-312 openGauss 数据迁移-MySQL迁移-迁移MySQL数据库至openGauss-概述

文章目录 openGauss学习笔记-312 openGauss 数据迁移-MySQL迁移-迁移MySQL数据库至openGauss-概述312.1 工具部署架构图 openGauss学习笔记-312 openGauss 数据迁移-MySQL迁移-迁移MySQL数据库至openGauss-概述 312.1 工具部署架构图 当前openGauss支持对MySQL迁移服务&#x…

【多任务YOLO】 A-YOLOM: You Only Look at Once for Real-Time and Generic Multi-Task

You Only Look at Once for Real-Time and Generic Multi-Task 论文链接&#xff1a;http://arxiv.org/abs/2310.01641 代码链接&#xff1a;https://github.com/JiayuanWang-JW/YOLOv8-multi-task 一、摘要 高精度、轻量级和实时响应性是实现自动驾驶的三个基本要求。本研究…

多光谱的空间特征和光谱特征Statistics of Real-World Hyperspectral Images

文章目录 Statistics of Real-World Hyperspectral Images1.数据集2.spatial-spectral representation3.Separable Basis Components4.进一步分析5.复现一下5.1.patch的特征和方差和论文近似&#xff0c;5.2 spatial的basis和 spectral的basis 6.coef model7.join model Statis…

多视角数据的不确定性估计:全局观的力量

论文标题&#xff1a;Uncertainty Estimation for Multi-view Data: The Power of Seeing the Whole Picture 中文译名&#xff1a;多视角数据的不确定性估计:全局观的力量 原文地址&#xff1a;Uncertainty Estimation for Multi-view Data: The Power of Seeing the Whole …