UITableView初识之分组显示数据Demo

· 基本介绍
继承自UIScrollView,因此可以滚动。
需要Datasource
遵循UITableViewDataSource协议的OC对象,都可以是UITableView的数据源,该协议中的方法告诉UITableView如何显示数据。

关于UITableView
UITableView显示分组数据,对应方法numberOfxxx,若不实现,默认有1组数据。
每组显示几行几行数据:
每一组的每一行显示什么单元格内容:cellForRowAtIndexPath:创建cell一般在这里。
cell可以自定义。
设置数据源,需要让当前类声明协议。
多组数据时,设置行数:numberOfRowsInSection。通过if(section)数值来判断当前是第几组,然后设置当前组的行数。
每组的每行cell设置:cellForRowAtIndexPath:通过参数indexPath可以获取到section定位当前在哪个组里,然后设置当前组的cell样式,因为每个组的cell需要相同。根据indexPath.row可以获取到具体是哪一行。
还可以设置组标题、组尾描述。
关于组数:一般一组数据在plist中是一个项,即使多组在你的代码中,仍然用一个Array存,组数用array.count获取即可。

字典的模型化:
快速初始化赋值的方式:不必挨个从plist中按键读取,有提供的接口,根据字典参数即可: [setValuesForKeysWithDictionary: dict];
设置数据加载方式为懒加载:plist中读进来的数据在代码中是对象数组,该对象数组存的是对象,
类型是NSMutableArray,它可以添加任何类型的元素。
如果奇数行和偶数行行高不一样,需要通过代理来实现。如果一样,则通过统一的代理来实现。
各个单元格背景颜色也可以设置
在表格最上面和表格最下面(如加载更多),一般可以放【加载更多】这种样式的信息框使用(tableFooterVIew),顶部广告用(tableHeadView)。

· 学习目标:
学会给UITableView加载多组数据,单组数据。
学会复用cell,自定义cell。

Demo:分组显示TableView数据

TableView有两种样式:
分组的Group:注意每行行高都一致的设置。
不分组的Plain

# 设置数据源的方式
self.tableView.dataSource = self;

汽车品牌案例Demo(分组实现多组数据)

在这里插入图片描述

实现

1 准备数据plist和汽车icon
在这里插入图片描述
在这里插入图片描述
2 封装字典数据为模型
(1)声明数据模型,plist中各组为一个数据模型

@interface CZGroup : NSObject
// 组标题:使用copy防止意外被改变、线程安全
@property(nonatomic, copy) NSString *title;
// 组描述
@property(nonatomic, copy) NSString *desc;
// 组内车信息
@property(nonatomic, copy) NSArray *cars;- (instancetype)initWithDict:(NSDictionary *)dict;
// 约定俗成:需要实现公有方法,类名+ WithDict
+ (instancetype)groupWithDict:(NSDictionary *)dict;
@end

(2)实现两个初始化方法,一个是传统初始化方法,一个是约定俗成的方法。

#import "CZGroup.h"@implementation CZGroup- (instancetype)initWithDict:(NSDictionary *)dict{if(self = [super init]){// KVC的写法:自动获取全部属性,并用字典的键赋值[self setValuesForKeysWithDictionary:dict];}return self;
}
+ (instancetype)groupWithDict:(NSDictionary *)dict{return [[self alloc] initWithDict:dict];
}@end

3 自定义UITableView
(1)该类需要实现数据源协议,故声明协议,再声明自定义属性:UITableView、装组数据的NSArray。

// 设置数据源需要声明协议
@interface UITableViewDemoCar : UIView<UITableViewDataSource>
@property(nonatomic, strong) UITableView *uitableview;
@property(nonatomic, strong) NSArray *groups;@end

(2)实现
初始化组件、数据成员懒加载、实现数据源协议的相关方法

#import "UITableViewDemoCar.h"
#import "CZGroup.h"@implementation UITableViewDemoCar-(instancetype) initWithFrame:(CGRect)frame{self = [super initWithFrame:frame];if(self){// 初始化时指定好样式,分组数据类型还是单组数据类型:UITableViewStyleInsetGrouped是一种变种,高版本后引入的// UITableViewStylePlain:某个组名,持续显示在上方 直到该组完全过去_uitableview = [[UITableView alloc]initWithFrame:self.bounds style: UITableViewStyleGrouped];_uitableview.dataSource = self;// 懒加载必须通过self调用self.groups;}// 开始没显示,因为没add[self addSubview: _uitableview];return self;
}/*数据描述:cars_simple中plist是数据、每个应该是组。每个组下是不同类型的车在定义cell内容的函数中触发懒加载*/
#pragma mark - 数据懒加载
-(NSArray *)groups{if(_groups == nil){// 懒加载: 1, 获取plist  2. 创建对象数组   3. 添加到对象数组  4. 赋值对象数组给数据group// 加载plist文件NSString *path = [[NSBundle mainBundle] pathForResource:@"cars_simple.plist" ofType:nil];// 创建字典NSArray *arrayDict = [NSArray arrayWithContentsOfFile:path];// 创建数组NSMutableArray *arrayModel = [NSMutableArray array];// 根据字典内容创建每个模型,并加入数组for(NSDictionary *dict in arrayDict){// 创建模型对象CZGroup *model = [CZGroup groupWithDict:dict];[arrayModel addObject:model];}//_groups = arrayModel;}return _groups;
}#pragma mark - 协议相关样式
// 分几组
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{return _groups.count;
}// 每组几行,section为组号(每次遍历到这里,组号都不一样,加载一个UITableView会调用多次这个方法)
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{// 根据组号获取group,返回组中的车数CZGroup *group = _groups[section];return  group.cars.count;
}// 每一组的每一行的内容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{// 1. 获取模型数据:此处,触发懒加载,所以别在init中使用group// 根据indexPath能获取到组号,而组号可以获取到数组中对应的数据模型,通过数据模型可以获取组内多行数据CZGroup *group = self.groups[indexPath.section];NSString *carBrand = group.cars[indexPath.row];UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];cell.textLabel.text = carBrand;// 通过在cell上的属性可以直接给特定位置赋值,这些属性其实写好了坐标位置//cell.textLabel.text = @"123";//cell.imageView;// cell.detailTextLabelreturn cell;
}// 设置组的标题
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{CZGroup *group = self.groups[section];return group.title;
}// 设置组末尾的描述信息
-(NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{CZGroup *group = self.groups[section];return group.desc;
}
// 设置组描述的数据源方法
@end

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

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

相关文章

企事业单位安全生产月活动怎样向媒体投稿?

作为一名单位的信息宣传员,我肩负着将每一次重要活动的精彩瞬间转化为文字,向外界传递我们单位声音的重任。初入此行时,我满怀热情,坚信通过传统的方式——电子邮件投稿,能够有效地将我们的故事传播出去。然而,现实却给我上了生动的一课。 记得在筹备“安全生产月”活动的宣传时…

韩顺平0基础学java——第21天

p430-440 enum昨日剩余 enum常用方法&#xff1a; 1.toString已经重写过了&#xff0c;返回的是当前对象名。子类可以重写 2.name&#xff1a;返回当前对象名&#xff08;常量名&#xff09;&#xff0c;子类中不能重写 3.ordinal&#xff1a;返回当前对象的位置号。默认从…

妙用OSGraph:发掘GitHub知识图谱上的开源故事

作者&#xff1a;范志东 1. 何为OSGraph&#xff1f; OSGraph (Open Source Graph) 是一个开源图谱关系洞察工具&#xff0c;基于GitHub开源数据全域图谱&#xff0c;实现开发者行为、项目社区生态的分析洞察。可以为开发者、项目Owner、开源布道师、社区运营等提供简洁直观的…

时序分解 | Matlab实现SCSSA-VMD融合正余弦和柯西变异的麻雀搜索算法优化变分模态分解时间序列信号分解

时序分解 | Matlab实现SCSSA-VMD融合正余弦和柯西变异的麻雀搜索算法优化变分模态分解时间序列信号分解 目录 时序分解 | Matlab实现SCSSA-VMD融合正余弦和柯西变异的麻雀搜索算法优化变分模态分解时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab…

曲线拟合 | 二次B样条拟合曲线

B 样条曲线拟合实例&#xff1a;能平滑化曲线 1. 实例1 为MASS包中mcycle数据集。它测试了一系列模拟的交通车事故中&#xff0c;头部的加速度&#xff0c;以此来评估头盔的性能。times为撞击时间(ms)&#xff0c;accel为加速度&#xff08;g&#xff09;。首先导入数据&#…

Docker(一)-认识Docker

1.docker理念 Docker是基于Go语言实现的云开源项目。 Docker的主要目标是“Build,Ship and Run Any App,Anywhere”&#xff0c;也就是通过对应用组件的封装&#xff0c;分发&#xff0c;部署&#xff0c;运行等生命周期的管理&#xff0c;使用户的应用及其运行环境能够做到”…

【机器学习300问】115、对比K近邻(KNN)分类算法与逻辑回归分类算法的差异与特性?

在学习了K近邻&#xff08;KNN&#xff09;和逻辑回归&#xff08;Logistic Regression&#xff09;这两种分类算法后&#xff0c;对它们进行总结和对比很有必要。尽管两者都能有效地执行分类任务&#xff0c;但它们在原理、应用场景和性能特点上存在着显著的差异。本文就是想详…

论文阅读:H-ViT,一种用于医学图像配准的层级化ViT

来自CVPR的一篇文章&#xff0c;https://openaccess.thecvf.com/content/CVPR2024/papers/Ghahremani_H-ViT_A_Hierarchical_Vision_Transformer_for_Deformable_Image_Registration_CVPR_2024_paper.pdf 用CNNTransformer混合模型做图像配准。可变形图像配准是一种在相同视场…

奇思妙想:多头RAG

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则提…

供应链初学者手册——第六部分:可持续供应链管理

供应链初学者手册 文章目录 供应链初学者手册第六部分&#xff1a;可持续供应链管理12. 绿色供应链管理12.1 可持续发展概念12.2 绿色供应链的实践 13. 可持续供应链案例分析13.1 真实案例研究13.2 成功经验和教训 总结 第六部分&#xff1a;可持续供应链管理 12. 绿色供应链管…

c语言利用openssl实现简单客户端和服务端(观察记录层最大长度)

文章目录 前言一、客户端实现二、服务端实现总结 前言 本文是使用openssl111w实现的简单客户端和服务端&#xff0c;主要用于观察openssl一个记录层数据包的大小。 一、客户端实现 #include <stdio.h> #include <stdlib.h> #include <string.h> #inc…

bugku---misc---赛博朋克

1、下载附件解压之后是一个txt文本&#xff0c;查看文本的时候看到头部有NG的字样 2、把txt改为png后缀得到一张图片 3、binwalk没发现奇怪的地方&#xff0c;分离出来还是图片 4、stegslove分析&#xff0c;切换图片没有发现奇怪地方 5、将通道rgb置为0。出现了flag但是flag不…

6.13长难句打卡

Hard times may hold you down at what usually seems like the most inopportune time, but you should remember that they won’t last forever. 艰难时刻可能会在你最不顺心的时刻让你低迷&#xff0c;但请相信&#xff0c;它们不会永远持续下去。

数据交易中公共物品属性

目录 数据交易中公共物品属性 公共物品属性 数据交易中公共物品属性 公共物品属性 传统上,公共物品的特性包括非排他性和非竞争性,这意味着一旦数据模型被创建,任何数据需求方都可以访问和使用它,而不影响其他方的使用。然而,在数据交易市场中,这种特性可能导致“搭便车…

通过apex启动flow

步骤 1&#xff1a;创建 Screen Flow 首先&#xff0c;确保您已经创建并激活了一个 Screen Flow。例如&#xff0c;创建一个简单的 Screen Flow&#xff0c;用于显示消息或执行特定逻辑。 步骤 2&#xff1a;定义 Flow 的输入变量 在 Screen Flow 中&#xff0c;定义所需的输…

179.二叉树:合并二叉树(力扣)

代码解决 /*** 二叉树节点的定义。* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, Tre…

jQuery如何判断一个dom元素的display属性是不是block

在jQuery中&#xff0c;你可以使用.css() 方法来获取一个DOM元素的CSS属性&#xff0c;包括display属性。然后&#xff0c;你可以检查这个属性的值是否等于"block"。 以下是一个简单的示例&#xff0c;展示了如何使用jQuery来判断一个DOM元素的display属性是否为&qu…

opencv 通过滑动条调整阈值处理、边缘检测、轮廓检测、模糊、色调调整和对比度增强参数 并实时预览效果

使用PySimpleGUI库创建了一个图形用户界面(GUI),用于实时处理来自OpenCV摄像头的图像。它允许用户应用不同的图像处理效果,如阈值处理、边缘检测、轮廓检测、模糊、色调调整和对比度增强。用户可以通过滑动条调整相关参数。 完整代码在文章最后,可以运行已经测试; 代码的…

第3章 Unity 3D着色器系统

3.1 从一个外观着色器程序谈起 新建名为basic_diffuse.shader的文件&#xff0c;被一个名为basic_diffuse.mat的材质文件所引用&#xff0c;而basic_diffuse.mat文件则被场景中名为Sphere的game object的MeshRenderer组件所使用。 basic_diffuse.shader代码文件的内容如下所示…

软设之敏捷方法

敏捷方法的总体目标是通过尽可能早地&#xff0c;持续地对有价值的软黏的交付&#xff0c;使客户满意 适用于&#xff1a;小步快跑的思想&#xff0c;适合小项目小团队 极限编程XP 4大价值观&#xff1a; 沟通 简单 反馈 勇气 5大原则 快速反馈 简单性假设 逐步修改…