【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的全部内容,欢迎大家学习和指正~

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

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

相关文章

图解 Twitter 架构图

写在前面 两年前&#xff0c;马老板收购了twitter&#xff0c;并且做了一系列的大动作。那么今天我们来看一下这个全球最火的软件之一的架构。 Twitter解析 开始之前&#xff0c;我先提前说明一下&#xff0c;我之前不是做搜推广的&#xff0c;所以对这些了解不是很深&…

实战项目: 负载均衡

0. 前言 这个项目使用了前后端,实现一个丐版的LeetCode刷题网站,并根据每台主机的实际情况,选择对应的主机,负载均衡的调度 0.1 所用技术与开发环境 所用技术: C STL 标准库 Boost 准标准库 ( 字符串切割 ) cpp- httplib 第三方开源网络库 ctemplate 第三方开源前端网…

【Java】已解决:java.lang.OutOfMemoryError: Java heap space

文章目录 一、问题分析背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决Java&#xff1a;java.lang.OutOfMemoryError: Java heap space 一、问题分析背景 在Java开发过程中&#xff0c;有时我们会遇到java.lang.OutOfMemoryError: Java heap spa…

容器镜像外网同步方案

目录 一、目的 二、安装nexus 1、购买香港云主机​编辑 2、安装nexus 3、启动nexus 服务 4、放行安全组 三、配置nexus 1、登录nexus管理页面 2、修改nexus密码 3、创建 Blob 存储空间(可选) 4、创建 镜像代理仓库 5、Realms配置 四、拉取镜像 1、配置docker 2、…

Floyd-Warshall

应用场景 要求出每两点之间的最短路。或判断两点之间的连通性&#xff08;两点之间是否有路径&#xff09;。 板子 代码&#xff08;必背!!!&#xff09; for(int k 1; k < n; k)for(int i 1; i < n; i)for(int j 1; j < n; j)d[i][j] min(d[i][j], d[i][k] …

C数据结构:排序

目录 冒泡排序 选择排序 堆排序 插入排序 希尔排序 快速排序 hoare版本 挖坑法 前后指针法 快速排序优化 三数取中法 小区间优化 快速排序非递归 栈版本 队列版本 归并排序 归并排序非递归 ​编辑 计数排序 各排序时间、空间、稳定汇总 冒泡排序 void Bub…

内存-VSS、RSS、PSS、USS

一、 VSS 虚拟耗用内存大小&#xff0c;是进程可以访问的所有虚拟内存的总量&#xff0c;包括进程独自占用的物理内存、和其他进程共享的内存、分配但未使用的内存。 RSS 驻留内存大小&#xff0c;是进程当前实际占用的物理内存大小&#xff0c;包括进程独自占用的物理内存、…

【Java】图的初识

文章目录 【Java】图的初识图是什么图的基本组成部分图的类型图的表示方法图的常见操作 Java中图的表示方法邻接矩阵邻接表 常见操作图的遍历深度优先搜索&#xff08;DFS&#xff09;广度优先搜索&#xff08;BFS) 结论 【Java】图的初识 图是什么 图是一种数学概念&#xf…

Unity 使用TextMeshPro实现图文混排

最后实现出的效果是这样的 开始实现 准备两张图 选中图片右键->Create->TextMeshPro->Sprite Asset 然后文件夹内就会出现一个同名的这个文件 新建一个Text Inspector面板 点击最底下的Extra Settings 然后把刚刚创建的SpriteAsset拖过来 放到对应的地方 然后…

富瀚微FH8322 ISP图像调试—BLC校正

1、简单介绍 目录 1、简单介绍 2、调试方法 3、输出结果 富瀚微平台调试有一段时间了&#xff0c;一直没有总结&#xff0c;我们调试ISP的时候&#xff0c;首先一步时确定好sensor的黑电平值&#xff0c;黑电平如果不准&#xff0c;则会影响到后面的颜色及对比度相关模块。…

快消品经销商需要注意哪些仓库管理细节,才能提效降本

仓库管理是快消品经销商必须重视的环节&#xff0c;只有仓库管理做好了&#xff0c;整体效率才能得到提升&#xff0c;成本才能降低&#xff0c;客户订单更快地交付&#xff0c;而在仓库管理中有很多细节需要经销商注意。 01仓库布局与设计&#xff1a;合理的仓库布局可以极大地…

Java17 --- SpringSecurity之OAuth2

一、OAuth2 1.1、使用github以授权码方式 1.1.1、注册应用程序 1.1.2、测试代码 pom依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-oauth2-client</artifactId></dependency> spring…

基于CPS-SPWM链式STATCOM系统在电压不平衡环境下控制策略的simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于CPS-SPWM链式STATCOM系统在电压不平衡环境下控制策略的simulink建模与仿真。利用电压外环PI调节器得到有功 电流指令值结合由负载侧电流检测 到 的无功 电流指令值 &#…

最新版点微同城源码34.7+全套插件+小程序前后端(含安装教程)

模板挺好看的 带全套插件 自己耐心点配置一下插件 可以H5可以小程序 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89394996 更多资源下载&#xff1a;关注我。

嘻嘻我是图床倒霉蛋

嘻嘻花了将近两个小时的时间配了一个小小的图床 手把手教你搭建阿里云图床(PicGoTypora阿里云OSS)&#xff0c;新手小白一看就会-阿里云开发者社区 (aliyun.com) 大体上按照这篇配置就好 七牛云因为测试域名30天到期,用自己的得备案,所以比较麻烦,建议直接上阿里云 我买了一…

股指期货功能

其金融期货的本质&#xff0c;决定了股指期货具有以下几方面特点&#xff1a; &#xff08;1&#xff09;交割方式为现金交割&#xff1b; &#xff08;2&#xff09;股指期货的持有成本较低&#xff1b; &#xff08;3&#xff09;股指期货的保证金率较低&#xff0c;杠杆性…

jrt从量变到质变

又是一个加班的周末&#xff0c;上周把台式机代码和数据库环境弄好了&#xff0c;这周进行大数据测试&#xff0c;直接把标本、标本医嘱、报告、报告结果、药敏结果等数据插入到1亿的规模&#xff0c;跑了一天一夜插入了5000多万个标本&#xff0c;后面接着补剩下的到一亿。 演…

书生·浦语大模型实战营第二期作业六

1、安装环境&#xff1a; 2、安装legent和agentlego&#xff1a; 3、部署apiserver&#xff1a; 4、legent web demo&#xff1a; 5、没搜到&#xff0c;很尴尬&#xff1a; 6、自定义工具&#xff1a; 7、智能体“乐高”&#xff1a; 8、智能体工具&#xff0c;识别图片&#…

Java文件/文件夹的新增/删除/递归遍历

获取File对象 这里的字符串可以乱写&#xff0c;但是如果不存在后续的操作也会失败 // 获取抽象的File对象&#xff08;文件或者目录&#xff0c;不一定真实存在&#xff09;File file1 new File("D:\\2_WorkSpace\\qcbyProject\\shixun\\collection-test\\src\\FileTes…

youlai-boot项目的学习—工程构建与运行

开发环境 系统:mac OS Ventura 13.2.1 终端: item2 Homebrew: 4.3.5 IDE: IntelliJ IDEA 2024.1.1 (Ultimate Edition) 代码分支 仓库&#xff1a;https://gitee.com/youlaiorg/youlai-boot.git 分支&#xff1a; master commit: 9a753a2e94985ed4cbbf214156ca035082e02723 …