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

捋清UITableView展示不同类型数据的差异

背景:

UITableView可以展示分组数据和单组数据,一般这两种数据有4种情况:

  1. 单组数据的简单类型,本身为字典数组,内部字典key对应的value全为基本数据类型。(如lol英雄展示案例,不分组且组内信息均不可再分)
    在这里插入图片描述

  2. 单组数据的复杂类型,本身为字典数组,有key对应的value是Array,且Array中存多个字典。(无案例展示,但可以想象,组内信息可以再分,这种很少见)

  3. 分组数据的简单类型,本身为字典,有key对应的value是Array,而Array中存的均是字符串或基本数据类型。(汽车分组案例之无car的详细信息)
    内部
    在这里插入图片描述

  4. 分组数据的复杂类型,本身为字典,有key对应的value是Array,且Array中存的是字典。
    (如汽车分组案例之car有详细信息)
    在这里插入图片描述


UITableView的cell如何定位数据?

·在cellForRowAtIndexPath函数中,通过参数indexPath。
· 如果是单组数据的简单类型,通过indexPath的row获取当前要展示的数据序号,因为只有1组数据,所以直接用row就能从数据模型(CZmodel)中通过定位获得。

此时的CZmodel:包含一个array,该array中存的是基本数据类型,还有一些基本数据类型的属性。可以用KVC的方式去赋值model的全部属性。因为array中存的内容不需要展开。

· 如果是分组数据,不论简单类型还是复杂类型,都需要先通过indexPath的section获取当前组的全部内容。当前组是个数据模型【plist的一个组】,再通过组数据模型中的array属性来获取对应的行数。indexPath的rows和section。

此时的CZmodel(也成为CZgroup):包含一个array和其他基本数据类型,但是当array中存有字典时,需要另外借助一个类,所以在CZGrou需要借助另外一个数据模型,使得group的array属性中存的全是数据模型。因此CZgroup不可直接通过KVC方式做赋值。而如果array中存的类型全是基本数据类型,则不需要借助另外一个数据模型。

总之,重点是搞清楚什么时候需要借助另外一个数据模型

复杂的分组数据组初始化:
(如下初始化时借助了CZcar的初始化函数)

@interface CZCarGroup : NSObject@property(nonatomic, copy) NSString *title;
@property(nonatomic, copy) NSArray *cars;
@end// 初始化函数截取
NSMutableArray *arrayModels = [NSMutableArray array];// 这里的dict对应plist中的items字典for(NSDictionary *item_dict in dict[@"cars"]){CZcar *car = [CZcar carWithDict:item_dict];[arrayModels addObject:car];// cars未初始化,不能用addObject}self.title = dict[@"title"];self.cars = arrayModels;

简单数据分组数据组初始化:
(如下初始化时直接用KVC方式)

@interface CZGroup : NSObject
@property(nonatomic, copy) NSString *title;
@property(nonatomic, copy) NSString *desc;
@property(nonatomic, copy) NSArray *cars;
@end
// 初始化函数节选:直接用KVC:
if(self = [super init]){// KVC的写法:自动获取全部属性,并用字典的键赋值[self setValuesForKeysWithDictionary:dict];}

分组数据简单情况和复杂情况剩下的一点区别就是在给cell赋值时,选取什么类型来获取group中的数据,显然一个是基本数据类型,一个是简单数据模型类型。然后给cell赋值的时候无非是一个直接赋值,一个选取属性赋值。

分组简单类型:

    NSString *carBrand = group.cars[indexPath.row];cell.textLabel.text = carBrand;

分组复杂类型:

    CZcar *car = group.cars[indexPath.row];cell.textLabel.text = car.name;

疑问:显示分组数组时,如何起作用定位到需要的row上?

组号通过indexPath.section获取。
行号通过indexPath.row获取。
单组数据的第几行直接通过row获取。

相关文章:

  • 聚合分析是Elasticsearch中非常强大的工具
  • nginx 配置2级目录 刷新404
  • 建议收藏!AIGC绘画基础,Midjourney风格码style reference code策展汇总合集
  • 后端项目实战--瑞吉外卖项目软件说明书
  • 升级和维护老旧LabVIEW程序
  • 主动元数据平台详解(下):BIG 十一问,详解定位、对接、血缘保鲜等问题
  • Zookeeper高频面试题整理(入门到精通)
  • 【Mars3d】config.json中的蓝色底图map.basemap = 2017代码实现
  • Jenkins For Windows编译构建C#项目环境搭建(完整版)
  • leetcode168:Excel表列名称
  • Linux函数localtime和time使用整理
  • 动捕技术服务+虚拟人动画制作:让ip形象更自然生动的“动”起来
  • 蓝桥杯软件测试第十五届蓝桥杯模拟赛1期题目解析
  • 2024年最新Microsoft Edge关闭自动更新的方法分享
  • Docker面试整理-Docker Swarm与Kubernetes有什么区别?
  • 2017年终总结、随想
  • IndexedDB
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • Linux链接文件
  • Python学习之路13-记分
  • React Native移动开发实战-3-实现页面间的数据传递
  • underscore源码剖析之整体架构
  • 基于 Babel 的 npm 包最小化设置
  • 基于游标的分页接口实现
  • 类orAPI - 收藏集 - 掘金
  • 免费小说阅读小程序
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 项目实战-Api的解决方案
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • HanLP分词命名实体提取详解
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (4)Elastix图像配准:3D图像
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (附源码)springboot教学评价 毕业设计 641310
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (四)React组件、useState、组件样式
  • (算法)N皇后问题
  • (一)基于IDEA的JAVA基础10
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • . Flume面试题
  • .dwp和.webpart的区别
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .net core 6 集成和使用 mongodb
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .net 生成二级域名
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .pop ----remove 删除
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • @Autowired @Resource @Qualifier的区别