当前位置: 首页 > news >正文

【iOS】UI学习——cell的复用及自定义cell

目录

  • 前言
  • cell的复用
    • 手动(非注册)
    • 自动(注册)
  • 自定义cell
  • 总结

前言

  Cell复用和自定义Cell是在开发iOS应用时常见的一种优化技巧和定制需求。
  Cell复用是UITableView或UICollectionView的一个重要优化机制。当用户滚动这些视图时,只有少量可见的Cell会被实际创建和显示,对于那些暂时不可见的Cell,系统会将它们缓存起来以备将来复用。这个机制主要是为了提高应用的性能,因为创建和销毁视图都是相对高开销的操作,通过复用Cell,我们可以避免不必要的视图创建和销毁,从而提高应用的滚动性能
  自定义Cell可以让你更好地控制Cell的外观和行为,提高代码的可读性和可维护性。自定义Cell主要的步骤包括创建自定义Cell类,添加UI元素,实现初始化方法,设置Cell的布局,以及在TableView中使用自定义Cell。
  在实际开发中,我们通常会结合使用Cell复用和自定义Cell,以达到既优化性能又满足特定需求的目的。

cell的复用

  Cell的复用是一种优化技术,主要用于iOS的UITableView和UICollectionView。需要注意的是,虽然这两种视图的实现方式略有不同,但复用的基本思想是相同的。
  当用户滚动UITableView或UICollectionView时,屏幕上显示的cell只是所有数据的一小部分。当某个cell滚动出屏幕时,系统会将其放入一个队列中等待复用,而不是立即销毁。当需要显示新的cell时,系统首先会检查这个队列,看看是否有可以复用的cell。如果有,就直接使用,如果没有,才会创建新的cell。
  这种复用机制可以极大地提高应用的性能。因为创建和销毁视图是相对耗费资源的操作,通过复用,可以减少这些操作,从而使滚动更加流畅。
  在实现cell复用时,需要给cell设定一个复用标识符(reuse identifier),然后在需要新的cell时,使用这个标识符去请求。如果队列中有可复用的cell,系统就会返回一个,否则就会创建新的cell。标识符的设定,使得我们可以为不同类型的cell设定不同的复用标识符,从而在同一个表视图或集合视图中使用多种类型的cell。

手动(非注册)

手动进行Cell复用主要涉及到以下几个步骤:

  1. 设置复用标识符:在创建Cell的时候,我们需要给每个Cell设置一个复用标识符,这个标识符通常是一个字符串,用来表示这个Cell的类型。在创建Cell的时候,我们会把这个标识符作为参数传入。
  2. 请求重用的Cell:在需要显示新的Cell时,我们会使用复用标识符去请求一个已经不再显示,但是还没有被销毁的Cell。这个请求的过程是通过调用UITableView或UICollectionView的dequeueReusableCell(withIdentifier:)方法来完成的,这个方法会返回一个可选类型的Cell,如果有可用的重用Cell,就会返回一个Cell,否则返回nil。
  3. 配置Cell:无论是新创建的Cell还是重用的Cell,都需要进行配置,以显示新的数据。配置Cell通常会在tableView(:cellForRowAt:)或collectionView(:cellForItemAt:)方法中完成。

代码示例:

 1. (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {static NSString *strID = @"id";UITableViewCell *cell = [_tabView dequeueReusableCellWithIdentifier: strID];if (cell == nil) {cell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: strID];}cell.textLabel.text = @"aaa";return cell;
}

自动(注册)

在iOS开发中,TableView和CollectionView的Cell复用是自动完成的,你只需要正确地设置复用标识符并在需要时请求复用的Cell。具体步骤如下:

  1. 设置复用标识符:当你创建自定义Cell的时候,需要为每一个Cell类型设置一个唯一的复用标识符。你可以在Cell的初始化方法中或者在Storyboard中设置这个标识符。
  2. 请求重用的Cell:在tableView(:cellForRowAt:)或collectionView(:cellForItemAt:)方法中,你需要使用复用标识符来请求一个可复用的Cell。你可以使用dequeueReusableCell(withIdentifier:)方法来完成这个请求。如果有可复用的Cell,这个方法会返回一个Cell,否则返回nil。
  3. 创建新的Cell:如果dequeueReusableCell(withIdentifier:)方法返回nil,说明没有可复用的Cell,你需要创建一个新的Cell。
  4. 配置Cell:对于获得的Cell,无论是新创建的还是复用的,你都需要按照当前的数据来配置它们。

代码示例:

 1. (void)viewDidLoad 
{[super viewDidLoad];// 如果使用 Nib 自定义 Cell[self.tableView registerNib:[UINib nibWithNibName:@"CustomCell" bundle:nil] forCellReuseIdentifier:@"myCell"];// 如果使用代码自定义 Cell[self.tableView registerClass:[CustomCell class] forCellReuseIdentifier:@"myCell"];
}

自定义cell

自定义Cell是在开发iOS应用时常用的一种方式,它能让你更好地控制Cell的外观和行为,提高代码的可读性和可维护性。自定义Cell主要的步骤包括:

  1. 创建自定义Cell类:首先,需要创建一个新的类,这个类通常会继承自UITableViewCell或UICollectionViewCell。
  2. 添加UI元素:在这个自定义Cell类中,我们可以添加你需要的UI元素,如UILabel,UIImageView等。
  3. 实现初始化方法:在自定义Cell类的初始化方法中,需要初始化我们添加的UI元素,并添加到Cell的contentView上。
  4. 设置Cell的布局:还需要在自定义Cell类中设置UI元素的布局,可以使用Auto Layout来完成这个任务。
  5. 在TableView中使用自定义Cell:在TableView的tableView(_:cellForRowAt:)方法中,我们需要先通过复用标识符尝试获取一个可复用的Cell,如果没有获取到,那么就创建一个新的自定义Cell实例,并返回。

通过自定义Cell,我们可以根据自己的需求来定制Cell的外观和行为,使我们的应用更具个性化。

代码示例:

先创建一个子类myCell,从属于UITableViewCell类。
在这里插入图片描述
myCell.h:

#import <UIKit/UIKit.h>NS_ASSUME_NONNULL_BEGIN@interface myCustomCell : UITableViewCell
@property (nonatomic, strong) UILabel *titleLabel;
@property (nonatomic, strong) UILabel *subtitleLabel;
@endNS_ASSUME_NONNULL_END

myCell.m:

#import "myCell.h"@implementation myCustomCell- (void)awakeFromNib {[super awakeFromNib];// Initialization code
}- (void)setSelected:(BOOL)selected animated:(BOOL)animated {[super setSelected:selected animated:animated];// Configure the view for the selected state
}
//重写父类的初始化方法,根据需求添加自己的逻辑
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {self = [super initWithStyle:style  reuseIdentifier:reuseIdentifier];if ([reuseIdentifier isEqualToString:@"indentifierCell"]) {_titleLabel = [[UILabel alloc] init];_titleLabel.textColor = [UIColor blueColor];_titleLabel.font = [UIFont systemFontOfSize:20];[self.contentView addSubview:_titleLabel];_subtitleLabel = [[UILabel alloc] init];_subtitleLabel.textColor = [UIColor cyanColor];_subtitleLabel.font = [UIFont systemFontOfSize:15];[self.contentView addSubview:_subtitleLabel];}return self;
}
//重写布局方法,根据需求自己设置
- (void)layoutSubviews {_titleLabel.frame = CGRectMake(40, 20, self.contentView.bounds.size.width - 40, 20);_subtitleLabel.frame = CGRectMake(40, 40, self.contentView.bounds.size.width - 40, 20);
}
@end

ViewController .h:

#import <UIKit/UIKit.h>@interface ViewController : UIViewController
<
//实现数据视图的普通协议
//数据视图的普通事件处理
UITableViewDelegate,
//实现数据视图的数据代理协议
//处理数据视图的数据代理
UITableViewDataSource
>
{//定义一个数据视图对象//数据视图用来显示大量相同格式的信息的视图UITableView* _tableview;
}@end

ViewController .m:

#import "ViewController.h"
#import "myCell.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.//创建数据视图_tableview = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height) style:UITableViewStylePlain];//设置数据视图的代理对象_tableview.delegate = self;//设置数据视图的数据源对象_tableview.dataSource = self;//注册子类[_tableview registerClass:[myCustomCell class] forCellReuseIdentifier:@"indentifierCell"];[self.view addSubview:_tableview];
}
// 设置数据视图的组数
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {return 1;
}
//获取每组元素的行数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {return 15;
}
//创建单元格对象函数
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {myCustomCell* cell = [_tableview dequeueReusableCellWithIdentifier:@"indentifierCell" forIndexPath:indexPath];cell.titleLabel.text = @"一级标题";cell.subtitleLabel.text = @"二级标题";return cell;
}
@end

总结

  通过对cell的复用和自定义cell,我们可以对自己写的页面进行更多的个性化设置。以上就是本篇博客关于cell复用和自定义cell的全部内容,欢迎大家学习和指正~

相关文章:

【iOS】UI学习——cell的复用及自定义cell

目录 前言cell的复用手动&#xff08;非注册&#xff09;自动&#xff08;注册&#xff09; 自定义cell总结 前言 Cell复用和自定义Cell是在开发iOS应用时常见的一种优化技巧和定制需求。   Cell复用是UITableView或UICollectionView的一个重要优化机制。当用户滚动这些视图时…...

【详细介绍下PostgreSQL】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…...

基于Matlab停车场车牌识别计时计费管理系统 【W2】

简介 停车场车牌识别计时计费管理系统在现代城市管理中具有重要意义。随着城市化进程的加快和车辆数量的增加&#xff0c;传统的人工管理停车场的方式已经难以满足效率和精确度的要求。因此引入车牌识别技术的自动化管理系统成为一种趋势和解决方案。 背景意义 提升管理效率&a…...

码住!详解时序数据库不同分类与性能对比

加速发展中的时序数据库&#xff0c;基于不同架构&#xff0c;最流行的类别是&#xff1f; 作为管理工业场景时序数据的新兴数据库品类&#xff0c;时序数据库凭借着对海量时序数据的高效存储、高可扩展性、时序分析计算等特性&#xff0c;一跃成为物联网时代工业领域颇受欢迎的…...

【C/C++】实参与形参的区别

在编程中&#xff0c;形参&#xff08;形式参数&#xff09;和实参&#xff08;实际参数&#xff09;是函数调用中的两个基本概念&#xff0c;它们在函数定义和函数调用中扮演着不同的角色。 形参&#xff08;Formal Parameters&#xff09;&#xff1a; 形参是在函数定义时声明…...

---异常---

我们在运行程序时总遇到各种与报错&#xff0c;数组越界&#xff0c;空指针的引用&#xff0c;这些在java中都称为异常 对于不同的错误都具有一个与他对应的异常类来秒描述 这是对于数组越界这个类里有的方法&#xff0c;这些是描述异常的 在java中有一个完整的描述异常的类的…...

python如何终止程序运行

方法1&#xff1a;采用sys.exit(0)&#xff0c;正常终止程序&#xff0c;从图中可以看到&#xff0c;程序终止后shell运行不受影响。 方法2&#xff1a;采用os._exit(0)关闭整个shell&#xff0c;从图中看到&#xff0c;调用sys._exit(0)后整个shell都重启了&#xff08;RESTAR…...

网络:用2个IP地址描述一个连接

用2个IP地址描述一个连接。这是在阅读了《TCP/IP指南》后的感想&#xff0c;与工业标准不同&#xff0c;需注意区分。 如果一个IP地址有48位&#xff0c;则用96位描述一个连接 对于单播&#xff0c;是每个IP分别描述位置。位置包括&#xff1a;邮局编号主机编号&#xff0c;采用…...

Nodejs--构建web应用

构建web应用 将从http模块中的服务器端中的request使劲按开始分析&#xff0c;request时间发生于网络连接建立&#xff0c;客户端想服务器发送报文&#xff0c;服务器解析报文&#xff0c;发现http请求的报文的时候&#xff0c;在出发request事件之前&#xff0c;已经准备好Se…...

C++ 二分查找法【面试】

在C中实现二分查找法是一个常见的面试问题。二分查找法是一种在有序数组中查找特定元素的算法&#xff0c;其时间复杂度为O(log n)。以下是使用C实现二分查找的示例代码&#xff1a; #include <iostream> #include <vector>// 二分查找法函数 int binarySearch(co…...

【Docker】docker-compose常用的构建docker容器的yml文件

docker-compose的简单使用方法&#xff0c;在准备好的文件夹中&#xff0c;mkdir好要挂载的如data或者conf文件夹&#xff0c;及vim docker-compose.yml&#xff0c;将下方的要使用的内容粘贴进去&#xff0c;根据自己需要添加/删除/修改一下。最后在当前文件夹直接后台启动即可…...

华为坤灵路由器初始化开局的注意事项,含NAT配置

坤灵路由器比较坑&#xff0c;无web界面&#xff0c;全程命令行配置&#xff0c;但是版本更新导致和华为企业路由器配置很多不一样的地方&#xff0c;今天介绍下 1、aaa密码复杂度修改&#xff1a; #使能设备对密码进行四选三复杂度检查功能。 <HUAWEI>system-view […...

HTTP!!!

HTTP 一 : 请求报文1.2 : 首行1.3 :请求头(header)1.4 : 空行1.5 : 正文 body 二: 响应报文2.2 : 首行 三 : URL 一 : 请求报文 一个HTTP 请求报文, 分成四个部分 首行 GET https://cn.bing.com/?FORMZ9FD1 HTTP/1.1请求头(header)空行正文(body) 1.2 : 首行 首行又分为三个…...

Mybatis用Map接收返回值可能出现的问题

先看一个示例 明明定义了Map<String,String> 实际内部存放的是Integer resultType是Map 也就是说Mybatis是通过反射将类型放进去的 躲过了编辑器检查 但是这样取值时候就会报类型转换错误 解决方式 resultMap 另外一种方式 用Number Integer和Double的父类 Ma…...

Web爬虫--fofa-资产信息搜集

免责声明:本文仅做技术交流与学习... 目录 fofa.py fofa搜索参数分析 fofa_api.py fofa.py import requests from bs4 import BeautifulSoup# 登录fofa之后,把自己的cookie弄过来. header{cookie: } # 参数为搜索的语法. urlhttps://fofa.info/result?qbase64dGl0bGU9IuS4…...

mySql的事务(操作一下)

目录 1. 简介2. 事务操作3. 四大特性4. 并发事务问题5. 脏读6. 不可重复读7. 幻读事务隔离级别参考链接 1. 简介 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作…...

UniApp或微信小程序中scroll-view组件使用show-scrollbar在真机Android或IOS中隐藏不了滚动条的解决办法

show-scrollbar 属性 不论是使用 变量 还是直接使用 布尔值或者直接使用 css 都是在 ios、Android 上是都没有效果。。 真机中还是出现滚动条 解决办法 添加下面CSS ::-webkit-scrollbar {display: none;width: 0 !important;height: 0 !important;-webkit-appearance: no…...

每天五分钟深度学习框架pytorch:多维tensor向量在某一维度的拼接和分割

本文重点 在深度学习中,我们常常需要完成多个向量拼接,同时也要完成向量的分割,在pytorch中已经有封装好的库,我们可以直接调用完成这部分任务。 Cat拼接 c=torch.cat([a,b],dim=0)表示将a和b按0维度进行拼接,需要注意再非dim维度,两个矩阵的维度必须是一致的,不然会拼…...

从C语言到C++(五)

从C语言到C&#xff08;五&#xff09; 自动类型推导尾拖返回类型类型信息推导typeid1. 定义和基本作用2. 使用方法3. 注意事项4. 示例代码5. 关联概念&#xff1a;RTTI decltype基本用法示例注意事项总结 基于范围的增强for循环示例 1&#xff1a;使用数组示例 2&#xff1a;使…...

数据结构——栈(Stack)详解

1. 栈&#xff08;Stack&#xff09; 1.1 概念 栈&#xff1a;一种特殊的线性表&#xff0c;只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中数据元素遵循后进先出LIFO(Last In First Out)的原则 压栈&am…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...