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

news2024/12/23 18:23:22

目录

  • 前言
  • 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;
@end

NS_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.coloradmin.cn/o/1829201.html

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

相关文章

【宠粉赠书】科研绘图神器:MATLAB科技绘图与数据分析

小智送书第二期~ 为了回馈粉丝们的厚爱&#xff0c;今天小智给大家送上一套科研绘图的必备书籍——MATLAB科技绘图与数据分析。下面我会详细给大家介绍这套图书&#xff0c;文末留有领取方式。 图书介绍 《MATLAB科技绘图与数据分析》是一本综合性强、内容丰富的书籍&#x…

【Android面试八股文】Java中有几种引用关系,它们的区别是什么?

在Java中,引用关系主要分为以下几种: 强引用(Strong Reference)软引用(Soft Reference)弱引用(Weak Reference)虚引用(Phantom Reference) 这些引用类型的区别在于它们对垃圾回收的影响程度。下面是对每种引用类型的详细解释及代码示例: 1. 强引用(Strong Referen…

Java面向对象-接口

Java面向对象-接口 一、JDK1.8之前二、接口的作用三、JDK1.8之后&#xff0c;新增非抽象方法四、静态方法 一、JDK1.8之前 1、类是类&#xff0c;接口是接口&#xff0c;它们是同一层次的概念 2、接口中没有构造器 3、接口如何声明&#xff1a;interface 4、在jdk1.8之前&…

植物大战僵尸杂交版最新pvzHE_v2.1.0含游戏窗口放大工具

植物大战僵尸杂交版是由B站”潜艇伟伟迷”UP主制作的一款同人策略塔防游戏&#xff0c;也叫pvzHE&#xff0c;该游戏由《植物大战僵尸》原版魔改而来&#xff0c;引入了创新的杂交合成系统&#xff0c;让玩家可以将不同植物进行杂交&#xff0c;创造出具有全新能力和外观的植物…

浪潮信息内存故障预警技术再升级 服务器稳定性再获提升

浪潮信息近日对其内存故障智能预警修复技术进行了全面升级&#xff0c;再次取得技术突破。此次升级后&#xff0c;公司服务器的宕机率实现了80%锐降&#xff0c;再次彰显了浪潮信息在服务器技术领域的卓越能力。 浪潮信息全新升级服务器内存故障智能预警修复技术MUPR (Memory …

复星杏脉算法面经2024年5月16日面试

复星杏脉算法面经2024年5月 面试记录&#xff1a;3个部分1. 自己介绍 2. 问八股 3.代码题先自我介绍20分钟问问题1. 梯度爆炸怎么解决&#xff0c;三个解决方案&#xff1a;梯度裁剪&#xff08;Gradient Clipping&#xff09;正则化&#xff08;Regularization&#xff09;调整…

《全网首发》平衡三进制图灵机的构建

PS:以下内容均为本人原创&#xff0c;未经授权及许可&#xff0c;严禁引图、转载或加工&#xff0c;违者必究。 ————2024年6月13号 1、图灵机的概述 图灵机&#xff08;Turing machine&#xff09;是一种理论计算模型&#xff0c;由英国数学家阿兰图灵&#xff08;Alan T…

Vue44-创建vue脚手架

一、Vue脚手架的版本说明 vue cli&#xff1a;command line interface 命令行接口工具 用最新的脚手架&#xff0c;这样可以兼容vue3荷vue2版本。 二、通过vue脚手架创建项目 注意&#xff1a; 执行npm run serve 启动项目的时候&#xff0c;要进入到创建的vue项目里面&…

Python(二)---数据类型与变量、以及运算符

文章目录 前言1.Python程序的构成1.1.代码的组织和缩进1.2.使用\行连接符 2.对象和引用、标识符规则2.1.对象2.2.引用2.3.标识符规则 3.变量和简单赋值语句3.1.变量的声明和赋值3.2.删除变量和垃圾回收机制3.3.常量3.4.链式赋值3.5.系列解包赋值 4.最基本内置数据类型4.1.数字和…

代理IP协议有何区别?深入了解 SOCKS5、HTTP 代理

在数字通信领域&#xff0c;数据安全和匿名性都是非常重要的指标。互联网的不断发展催生了几种协议&#xff0c;每种协议都有独特的优势和挑战。其中&#xff0c;SOCKS5 代理、HTTP代理最为广泛使用&#xff0c;下面给大家一起讨论&#xff0c;HTTP代理与 SOCKS5代理&#xff0…

Django中间件探索:揭秘中间件在Web应用中的守护角色与实战应用

系列文章目录 Django入门全攻略&#xff1a;从零搭建你的第一个Web项目Django ORM入门指南&#xff1a;从概念到实践&#xff0c;掌握模型创建、迁移与视图操作Django ORM实战&#xff1a;模型字段与元选项配置&#xff0c;以及链式过滤与QF查询详解Django ORM深度游&#xff…

北航第六次数据结构与程序设计作业(查找与排序)选填题

一、 顺序查找的平均查找长度ASL&#xff08;1 2 …… n&#xff09;/ n (n 1&#xff09;/ 2 二、 这半查找法的平均查找次数和判定树的深度有关系。若查找一个不存在的元素&#xff0c;说明进行了深度次比较。 注意&#xff0c;判定树不是满二叉树&#xff0c;因此深…

生信分析进阶5 - 全外显子组变异检测和ANNOVAR注释Snakemake分析流程

基于yaml或ini配置文件&#xff0c;配置文件包含例如样本名称、参考基因组版本、exon capture bed文件路径、参考基因组路径和ANNOVAR注释文件等信息。 基于该流程可以实现全外显测序的fastq文件输入到得到最终变异VCF文件。 1. Snakemake分析流程基础软件安装 # conda安装 …

Vue3【二十一】Vue 路由模式(createWebHashHistory /createWebHistory )和RouterLink写法

Vue3【二十一】Vue 路由模式&#xff08;createWebHashHistory /createWebHistory &#xff09;和RouterLink写法 Vue3【二十一】Vue 路由模式和普通组件目录结构 createWebHistory history模式&#xff1a;url不带#号&#xff0c;需要后端做url适配 适合销售项目 利于seo crea…

pytorch学习笔记6

想要找一些官方的小工具数据集&#xff0c;可以进入pytorch官网&#xff0c;DOCS-》pytorch下拉至libraries&#xff0c;点击torchversion&#xff0c;调整版本至0.9.0就可以找到相应的一些数据集&#xff0c;训练集 ctrlp可以看一个函数中需要设置哪些参数 下载数据集可以参考…

C/C++中内存开辟与柔性数组

C/C中内存的开辟 在C中&#xff0c;我们都知道有三个区&#xff1a; 1. 栈区&#xff08;stack&#xff09;&#xff1a;在执行函数时&#xff0c;函数内局部变量的存储单元都可以在栈上创建&#xff0c;函数执行结 束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指…

云和运维(SRE)的半生缘-深读实证02

这个标题不算太夸张&#xff0c;云计算和很多IT岗位都有缘&#xff0c;但是和运维&#xff08;SRE&#xff09;岗位的缘分最深。 “深读实证”系列文章都会结合一些外部事件&#xff0c;点明分析《云计算行业进阶指南》书中的内容。本次分享介绍了下列内容&#xff1a; 我以运维…

Git学习记录v1.0

1、常用操作 git clonegit configgit branchgitt checkoutgit statusgit addgit commitgit pushgit pullgit loggit tag 1.1 git clone 从git服务器拉取代码 git clone https://gitee.com/xxx/studyJava.git1.2 git config 配置开发者用户名和邮箱 git config user.name …

数值分析笔记(二)函数插值

函数插值 已知函数 f ( x ) f(x) f(x)在区间[a,b]上n1个互异节点 { x i } i 0 n \{{x_i}\}_{i0}^{n} {xi​}i0n​处的函数值 { y i } i 0 n \{{y_i}\}_{i0}^{n} {yi​}i0n​&#xff0c;若函数集合 Φ \Phi Φ中函数 ϕ ( x ) \phi(x) ϕ(x)满足条件 ϕ ( x i ) y i ( i …

决策树概念

图例 概念 决策树基本上就是对经验的总结 决策树的构成&#xff0c;分为两个阶段。构造和剪枝 构造 概念 构造就是生成一颗完整的决策树。构造的过程就是选择什么属性作为节点的过程 构造过程&#xff0c;会存在3种节点 根节点&#xff1a;就是树的最顶端&#xff0c;最…