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.xdnf.cn/news/1450879.html

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

相关文章

C++设计模式——Proxy代理模式

一&#xff0c;代理模式简介 代理模式是一种 结构型设计模式&#xff0c;该模式通过引入一个新的代理对象Proxy&#xff0c;来间接访问原始对象&#xff0c;从而使访问方式变得灵活和可控。 代理对象的设定减少了客户端与真实对象之间的直接交互。 通过引入代理对象来间接访问原…

VRChat 2024年裁员原因与背景深度分析

VRChat&#xff0c;作为2022年元宇宙/VR社交领域的巨头&#xff0c;近期在2024年宣布裁员计划&#xff0c;其背后原因和背景值得业界尤其是仍在纯元宇宙虚拟空间创业的同仁们重点关注。 一、创始人决策失误 根据CEO的邮件披露&#xff0c;VRChat的创始人因缺乏经验和过度自信…

网络安全 - kali 安装

文章目录 Kali 安装教程下载镜像 Kali 安装教程 下载镜像 kali-images安装包下载_开源镜像站-阿里云 (aliyun.com) 下载对应镜像&#xff08;自己挑&#xff09; 打开本机 cmd 并输入一下命令 ipconfig找到 NAT 模式的 IP 地址并从虚拟机中 ping

【Linux】环境设置MySQL表名忽略大小写

目录 说明 一、摘要 二、查看服务器上MySQL情况 方式一&#xff1a;通过Linux方式 方式二&#xff1a;借助可视化工具&#xff08;Navicat&#xff09; 三、MySQL设置忽略表名大小写的参数&#xff08;lower_case_table_names&#xff09; 四、网上解决方案 方法一&…

基于线性核函数的SVM数据分类算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于线性核函数的SVM数据分类算法matlab仿真&#xff0c;通过程序产生随机的二维数据&#xff0c;然后通过SVM对数据进行分类&#xff0c;SVM通过编程实现&#x…

94. 二叉树的中序遍历 (Swift版本, 递归)

题目描述 使用递归方法解题 使用了一个递归函数 inorder 来进行二叉树的中序遍历&#xff0c;并将结果存储在数组 ret 中 /*** Definition for a binary tree node.* public class TreeNode {* public var val: Int* public var left: TreeNode?* public var ri…

Python | Leetcode Python题解之第149题直线上最多的点数

题目&#xff1a; 题解&#xff1a; class Solution:def maxPoints(self, points: List[List[int]]) -> int:n len(points)if n < 2:return nres 2for i in range(n):x1, y1 points[i][0], points[i][1]has {}for j in range(i 1, n):x2, y2 points[j][0], points…

x64汇编fastcall调用约定

x64汇编环境&#xff1a;只需要在x86基础上对项目属性进行设置&#xff0c;将平台设置为所有平台&#xff1b; 以及在将debug改为x64模式即可&#xff1a; 后续写完代码直接生成项目再使用本地调试器进行运行即可。 fastcall调用约定 在x64架构下&#xff0c;fastcall调用约定…

【StableDiffusion】采样方法对比优缺点及评估,采样器 调度器(目前已有的 采样器介绍与评估)

采样器 Sampler 采样方法 决定了 如何从 噪声 生成 图像 的过程&#xff0c;也就是去噪过程如何进行 包含 DPM 的采样方法&#xff08;逆转扩散采样&#xff09; DPM → Diffusion Probabilistic Models&#xff08;扩散概率模型&#xff09; DPM、DPM2 包含 DPM 的采样方…

解决CentOS的yum命令失效的问题

近日笔者对一台装有 CentOS 7.9 系统的服务器反复折腾&#xff0c;玩到最后发现 yum 命令用不了&#xff0c;总是报下面的错误信息&#xff1a; There was a problem importing one of the Python modules required to run yum. The error leading to this problem was:/usr/l…

C# WPF入门学习主线篇(二十八)—— 使用集合(ObservableCollection)

C# WPF入门学习主线篇&#xff08;二十八&#xff09;—— 使用集合&#xff08;ObservableCollection&#xff09; 在WPF中&#xff0c;数据绑定是构建动态和响应式用户界面的关键。ObservableCollection是一个特别有用的集合类型&#xff0c;它不仅支持数据绑定&#xff0c;还…

Python | Leetcode Python题解之第150题逆波兰表达式求值

题目&#xff1a; 题解&#xff1a; class Solution:def evalRPN(self, tokens: List[str]) -> int:op_to_binary_fn {"": add,"-": sub,"*": mul,"/": lambda x, y: int(x / y), # 需要注意 python 中负数除法的表现与题目不一…

面试题记录1

题目&#xff1a; 给定一个输入序列01101001101101101找出序列为1101并统计其个数。请用有限状态机&#xff08;FSM&#xff09;实现。 解题&#xff1a; 代码&#xff1a; module sequence_detector(input wire clk, // 时钟信号input wire reset, // 复位信号input wir…

JasperReport-报表中文不显示问题解决

在用Jaspersoft Studio进行报表设计的时候默认采用的字体是SansSerif&#xff0c;通过jasperreport的JAVA SDK进行报表输出时就会出现中文不显示问题。另外即便在Jaspersoft Studio设置的是中文字体&#xff0c;通过JAVA端生成也可能出现中文不显示。原因是SDK包中没有包含中文…

Github 2024-06-13开源项目日报Top10

根据Github Trendings的统计,今日(2024-06-13统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目3非开发语言项目2Shell项目1TypeScript项目1Swift项目1PHP项目1Blade项目1JavaScript项目1从零开始构建你喜爱的技术 创建周期:2156…

【单片机毕业设计选题24003】-基于STM32和阿里云的家庭安全监测系统

系统功能: 此设计采用STM32单片机采集环境温湿度,烟雾浓度和一氧化碳浓度显示在OLED上&#xff0c;并将这些信息上报至阿里云平台。 1. 上电连接手机热点后自动连接阿里云&#xff0c;可通过阿里云平台收到系统上报的温湿度&#xff0c;烟雾 浓度&#xff0c;一氧化碳数据以…

日常销售数据分析为什么重要?三个维度全面分析日常销售数据

在当今电子商务的浪潮席卷全球的时代&#xff0c;网店如雨后春笋般涌现&#xff0c;并且竞争日趋激烈。在这样一个充满挑战与机遇的环境中&#xff0c;如何洞察市场动向&#xff0c;把握消费者需求&#xff0c;实现销售业绩的稳步增长&#xff0c;成为每一位电商运营者必须面对…

Jenkins For Windows编译构建C#项目环境搭建(完整版)

安装Jenkins 下载Windows安装包 官方下载地址 选择稳定版&#xff0c;这里下载的是最新版&#xff0c;如需下载指定版本点击 以前的发行版 配置java环境 下载 java jdk 17 jdk17官方下载链接 这里下载的是msi版本的安装包 安装jdk17 双击运行安装包&#xff0c;一直下…

Java | Leetcode Java题解之第150题逆波兰表达式求值

题目&#xff1a; 题解&#xff1a; class Solution {public int evalRPN(String[] tokens) {int n tokens.length;int[] stack new int[(n 1) / 2];int index -1;for (int i 0; i < n; i) {String token tokens[i];switch (token) {case "":index--;stack…

【分布式技术专题】「OceanBase深度解析」 探索OceanBase产品矩阵与核心设计

探索OceanBase产品矩阵与核心设计 OceanBase的六大特性高扩展高可用多租户&#xff08;资源隔离&#xff09;OceanBase架构和功能OceanBase广泛的数据源支持 OceanBase的六大特性 OceanBase以其卓越的产品平台整合方案&#xff0c;充分展现了六大核心特性的卓越与全面。这一方…