UITableView之显示单组数据Demo

需求

  1. UITableView实现显示单组数据。
  2. 尝试设置不同行高度不同。

效果:

在这里插入图片描述

数据展示

在这里插入图片描述

实现

  1. 与之前分组显示数据的区别在于懒加载的数据模型不同。
    (1)声明数据模型类
    类的属性一定要和plist中数据的字段保持一致
@interface CZhero : NSObject
// 图片
@property(nonatomic, copy) NSString *icon;
// info
@property(nonatomic, copy) NSString *intro;
// name
@property(nonatomic, copy) NSArray *name;// 读取的仍然是字典
- (instancetype)initWithDict:(NSDictionary *)dict;
// 约定俗成:需要实现公有方法,类名+ WithDict
+ (instancetype)heroWithDict:(NSDictionary *)dict;@end

(2)实现数据模型类

#import "CZhero.h"@implementation CZhero
- (instancetype)initWithDict:(NSDictionary *)dict{if(self = [super init]){// KVC的写法:自动获取全部属性,并用字典的键赋值[self setValuesForKeysWithDictionary:dict];}return self;
}
+ (instancetype)heroWithDict:(NSDictionary *)dict{return [[self alloc] initWithDict:dict];
}
@end
  1. 自定义UITableView类
    (1)声明:设置行高需要声明代理,显示数据本身需Datasource
    成员:UITableView、数组
@interface UITableViewDemoOneGroup : UIView<UITableViewDataSource, UITableViewDelegate>@property(nonatomic, strong) UITableView *uitableview;
@property(nonatomic, strong) NSArray *herodatas;@end

(2)实现:
0> 初始化UITableView并设置dataSource、delegate。
1> 懒加载数据:单组数据和分组显示数据的格式都一样,都是从plist中加载字典,基本五个步骤。
2> 注意设置cell样式不同,UITableViewCellStyleSubtitle和StyleDefault不一样。
3> 设置奇偶行高不同。

#import "UITableViewDemoOneGroup.h"@implementation UITableViewDemoOneGroup-(instancetype) initWithFrame:(CGRect)frame{self = [super initWithFrame:frame];if(self){// UITableViewStylePlain:单组数据_uitableview = [[UITableView alloc]initWithFrame:self.bounds style: UITableViewStylePlain];_uitableview.dataSource = self;_uitableview.delegate = self;}// 开始没显示,因为没add[self addSubview: _uitableview];return self;
}#pragma mark - 加载数据
-(NSArray *)herodatas{if(_herodatas == nil){// 懒加载: 1, 获取plist  2. 创建对象数组   3. 添加到对象数组  4. 赋值对象数组给数据groupNSString *path = [[NSBundle mainBundle] pathForResource:@"heros.plist" ofType:nil];NSArray *arrayDict = [NSArray arrayWithContentsOfFile:path];NSMutableArray *arrayModel = [NSMutableArray array];// 根据字典 创建模型,加入数组for(NSDictionary *dict in arrayDict){CZhero *model = [CZhero heroWithDict:dict];[arrayModel addObject:model];}_herodatas = arrayModel;}return _herodatas;
}#pragma mark - 协议相关样式
// 单组:所有英雄是一个组
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{return 1;
}// 每组几行:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{return  self.herodatas.count;
}// 每一行cell
// 因为只有一组,indexPath始终是0
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{// indexPath始终是0,所以通过row获取modelCZhero *model = self.herodatas[indexPath.row];// default类型cell,不会显示简介UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:nil];cell.imageView.image = [UIImage imageNamed:model.icon];cell.textLabel.text = model.name;cell.detailTextLabel.text = model.intro;// 单元格中显示右边的标记cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;return cell;
}// 设置行高:通过代理方法,也没设置self
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{int rowNum = indexPath.row;if(rowNum%2 == 0){return 60;}else{return 100;}
}@end

· 关于:设置奇偶行行高不同
如果设置所有行高度相同,用self.tableView.rowHeight属性。
但是要设置不同行的高度不同,通过代理方法实现。所以在自定义类上声明。
注意代理和数据源必须赋值self,否则不显示
如下,奇偶行宽度明显不一样
在这里插入图片描述

遇到问题

  1. 初步声明完自定义类后,运行失败

当你在自定义类中声明某协议后,一定要实现必须实现的方法。

  1. setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key intro.’

数据模型的属性名要完全和plist中的字段名完全一致。

  1. Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ‘-[__NSCFString content]: unrecognized selector sent to instance 0x600000c68bd0’
    *** First throw call stack:

错误的赋值方式,需要使用下面方式,图片对象来赋值,而直接用图片名赋值会找不到。
[UIImage imageNamed:model.icon]

  1. UITableViewCellStyleSubtitle和UITableViewCellStyleDefault的区别:
    默认状态的cellStyle不会显示cell.detailTextLabel.text = model.intro;
    默认状态不会显示信息。

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

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

相关文章

go 语言爬虫库goQuery 的详细使用(知乎日报详情页解析示例)

上一篇《uniapp小程序开发 | 从零实现一款影视类app 》实现了影视小程序的前端和后台接口&#xff0c;虽然包含了大多数小程序应有的知识&#xff0c;但基本还只是涉及网络接口和vue页面的设计。这里介绍下零一个有趣的练手项目&#xff0c;知乎日报。涉及详情页面的html解析&a…

线性稳压器LDO的基础知识

一、什么是线性稳压器? 线性稳压器的工作原理是&#xff1a;采用一个压控电流源以强制在稳压器输出端上产生一个固定电压。控制电路连续监视&#xff08;检测&#xff09;输出电压&#xff0c;并调节电流源&#xff08;根据负载的需求&#xff09;以把输出电压保持在期望的数值…

【Spine学习12】之 事件帧

1、新建事件帧&#xff1a; 2、选择第8s的攻击帧&#xff0c;点击第一步新建的attack事件帧前面的钥匙 这样每次动作到8s的时候会自动跳出事件帧提示 这个文字实际动画不会显示 事件是动画过程中所发生情况的触发器。 给程序员识别的

分享:2024年(第12届)“泰迪杯”数据挖掘挑战赛省级奖项获奖名单公示

本次竞赛有评选省奖的省份有广东省、广西壮族自治区、河北省、湖北省。各省奖项依据“泰迪杯”全国评审专家组统一评阅的最终成绩区分省份后从高到低依序按比例产生。 广东省 省级奖项获奖名单公示 奖项设置&#xff1a; 一等奖&#xff1a;约占该省份队伍总数的5%&#xff0…

Android开发系列(四)Jetpack Compose之Button

在Jetpack Compose中&#xff0c;Button是一个常用的用户界面组件&#xff0c;用于执行某些操作或触发某些事件。Button控件是可触摸的&#xff0c;并且通常会显示一个文本或图标来表示其功能。 要在Jetpack Compose中创建一个Button&#xff0c;可以使用Button()函数&#xf…

shell学习记录

shell简介 参考博文1 参考博文2——shell语法及应用 参考博文3——vi的使用 在linux中有很多类型的shell&#xff0c;不同的shell具备不同的功能&#xff0c;shell还决定了脚本中函数的语法&#xff0c;Linux中默认的shell是 / b in/ b a s h &#xff0c;流行的shell有as…

B-splines曲线的绘制(Matlab)

虽然在这个链接三次 Bspline(B样条曲线) NURBS曲线的绘制 matlab_三次b样条曲线的绘制-CSDN博客中我们介绍了NURBS曲线&#xff0c;然而有时候我们通过B-spline曲线也能够解决问题。B-spline曲线作为NURBS曲线的一种特例&#xff0c;这里给出均匀B-spline曲线的表达式&#xff…

基于IDEA的Maven简单工程创建及结构分析

目录 一、用 mvn 命令创建项目 二、用 IDEA 的方式来创建 Maven 项目。 &#xff08;1&#xff09;首先在 IDEA 下的 Maven 配置要已经确保完成。 &#xff08;2&#xff09;第二步去 new 一个 project &#xff08;创建一个新工程&#xff09; &#xff08;3&#xff09;…

论文精读——KAN

目录 1.研究背景 2.关键技术 2.1 原始公式 2.2 KAN结构 2.3 缩放定律 3.技术扩展 4.模型效果 5.相关讨论 6.总结 文章标题&#xff1a;《KAN: Kolmogorov–Arnold Networks》 文章地址&#xff1a; KAN: Kolmogorov-Arnold Networks (arxiv.org)https://arxiv.org/a…

再次递表港交所,慧算账能否把握AI+财税SaaS机遇?

5月以来&#xff0c;港股IPO市场日渐兴旺&#xff0c;多家公司实现上市首日“零破发”&#xff0c;平均收涨约30%&#xff0c;6月更是出现了超2500倍超购新股。市场赚钱效应显现&#xff0c;投资者打新随之热情高涨&#xff0c;越来越多国内企业也开始抓紧赴港上市。 近日&…

Android-app自动更新总结(已适配9-0)(1)

} //检查版本号&#xff0c;第一次请求(post)&#xff0c;&#xff0c;&#xff0c;UpdateAppBean根据服务器返回生成 private void requestAppUpdate(int version, final DataRequestListener listener) { OkGo.post(Const.HOST_URL Const.UPDATEAPP).params(“version”, v…

vue element-ui 下拉框 以及 input 限制输入,小数点后保留两位 界面设计案例 和 例子:支持mp4和m3u8视频播放

vue input 限制输入&#xff0c;小数点后保留两位 以及 图片垂直居中显示 和 分享 git 小技巧-CSDN博客文章浏览阅读430次&#xff0c;点赞5次&#xff0c;收藏4次。error:Your local changes to the following files would be overwritten by merge:_error: your local change…

2024.6.18 作业 xyt

今日作业&#xff1a; 1. 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果…

C++ 64 之 函数模版和普通函数调用规则

#include <iostream> #include <string> using namespace std;template<typename T> void myPrint(T a, T b){cout << "函数模板的调用" << endl; }void myPrint(int a, int b){cout << "普通函数调用" << endl…

C#——只读属性readonly

只读属性readonly 类的字段可以通过一个readonly(只读)表示这个为只读字段&#xff0c;不能被构造函数之外地方进行修改&#xff0c;静态只读字段不能在非静态的构造函数中使用 定义 只读属性的特点&#xff1a; 字段是只读的非静态 只能在非静态方法中进行修改 字段是只读的…

NoSQL-Tidis支持分布式事务,兼容redis协议,使用tikv存储引擎,可水平扩展

项目repo地址 GitHub - yongman/tidis: Distributed transactional NoSQL database, Redis protocol compatible using tikv as backend Tidis是分布式数据库,支持redis协议,多种数据结构支持,编写语言为golang。 Tidis工作角色类似于TIDB,提供协议转换和数据结构计算,底…

RockChip Android12 System之Datetime

一:概述 本文将针对Android12 Settings二级菜单System中Date&time的UI修改进行说明。 二:Date&Time 1、Activity packages/apps/Settings/AndroidManifest.xml <activityandroid:name="Settings$DateTimeSettingsActivity"android:label="@stri…

Unity基础(三)3D场景搭建

目录 简介: 一.下载新手资源 二.创建基本地形 三.添加场景细节 四,添加水 五,其他 六. 总结 简介: 在 Unity 中进行 3D 场景搭建是创建富有立体感和真实感的虚拟环境的关键步骤。 首先&#xff0c;需要导入各种 3D 模型资源&#xff0c;如建筑物、角色、道具等。这些模…

springboot与flowable(9):候选人组

act_id_xxx相关表存储了所有用户和组的数据。 一、维护用户信息 Autowiredprivate IdentityService identityService;/*** 维护用户*/Testvoid createUser() {User user identityService.newUser("zhangsan");user.setEmail("zhangsanqq.com");user.setF…

CHATGPT说这个运算放大器是比较器,我说这是运放典型的同相比例放大器,一个光控电路分析

纠正 图1 光控电路 该电路来自一个问题&#xff0c;链接见文末。 因GPT的分析有误&#xff0c;特此纠正。 引用图片和答案用于分析&#xff0c;如侵权请联系本人。 电路分析&#xff1a; 该电路为光控灯电路&#xff0c;灯光为LED发光二极管 D。 光敏电阻RG的阻值和光线强度关…