类似索引Model套Model之 iOS模型闲聊二

看下界面, 这是类似于索引的页面, 只不过木有右侧索引条的布局. 如果想了解通讯录索引的,请移步iOS - 高仿通讯录之商品索引排序搜索.

提供思路如下:

  1. 分析界面及接口
  2. 用 MVC 设计模式来实现(其实核心点都在下面5)
  3. 创建内外层 Model 并绑定两者 Model
  4. 两者 Cell 布局的实现 (便于后期界面的快速更改)
  5. 在外层控制器内进行逻辑操作并请求数据的分区及每个分区行数的处理. 5.1 创建一个保存数据的数组timeList, 这个数组是外层列表数组(分区时间数组) 5.2 拿到数组后, 就可以考虑分区数目及当前分区下 cell 数目 5.3 创建header的界面及数据 5.4 找到相对应的分区去带回内层数组
  6. 跳转控制器内层数组的传值简单实现.

Step1. 分析界面及接口

首先我们先分析这个界面: 很明显这是一个 tableView 的多分区多cell的布局. 这样就好办许多,截取一个分区来做说明.

很明显的能看出来, 这必须只能是 Model 套 Model 了. 分析下接口:

##Step2. 用 MVC 设计模式来实现. 大致思路有了,那我们接着该整理 MVC 了. 简单来说, 就是创建两套 MVC: 外层盘点记录的 MVC 与 内层盘点详情的 MVC(其中内层的还包括外层盘点记录下的每个当前分区下的记录 cell 详情). 看起来是两套 MVC, 由于我们内层的两个数组里字典数据是一样的模型, 我就共用了一套内层 M, 其实是三部分的交错使用. 看个点击分区跳转到盘点详情的 MVC 界面:

##Step3. 创建内外层 Model 并绑定两者 Model 由于只提供思路,就只放核心部分代码. 先创建内层的 子Model(YYPRecordDetailsModel)就和一般正常的 Model 创建一样就好,

// 时间
@property (nonatomic, copy) NSString *dotime;// 商品名称
@property (nonatomic, copy) NSString *commodityName;// 商品金额
@property (nonatomic, assign) float commodityAmt;// 实际盘点数量
@property (nonatomic, assign) NSInteger inventoryNum;// 库存数量
@property (nonatomic, assign) NSInteger stockNum;
复制代码

接着创建外层的 一级Model(YYPInventoryRecordModel), 除了几个基本单元素外, 两个内层数组是子 Model 不要忘了要放进去.

// 详情全部数据
@property (nonatomic, strong) NSArray *inventoryList;// 亏盈数据
@property (nonatomic, strong) NSArray *inventoryList2;
复制代码

最后在外层 Model 的. m 里实现两者的绑定.

+ (NSDictionary *)objectClassInArray {return @{@"inventoryList" : [YYPRecordDetailsModel class], @"inventoryList2" : [YYPRecordDetailsModel class]};
}
复制代码

##Step4. 两者 Cell 布局的实现 页面都是根据产品和 UI 确定, 我们单独写UITableViewCell, 好处就是便于后期界面的快速更改.

可以根据自己的界面来写. 我这里就记录下 Model 赋值. 一定切记,选择相对应的 Model. 我这里展示分区下的 cell 就相对应的是子Modle.

// model赋值
- (void)setModel:(YYPRecordDetailsModel *)model {_model = model;// 商品名称self.commodityName.text = [NSString stringWithFormat:@"%@", model.commodityName];// 单价self.commodityAmt.text = [NSString stringWithFormat:@"¥%.2f", model.commodityAmt];// 盈亏if (model.inventoryNum >= model.stockNum) {self.result.textColor = YYPGrayTitleColor;if (model.inventoryNum > model.stockNum) {self.result.text = [NSString stringWithFormat:@"+%ld", (model.inventoryNum - model.stockNum)];} else {self.result.text = @"0";}} else if (model.inventoryNum < model.stockNum) { // 亏self.result.textColor = YYPRedTitleColor;self.result.text = [NSString stringWithFormat:@"-%ld", (model.stockNum - model.inventoryNum)];}
}
复制代码

##Step5. 在外层控制器内进行逻辑操作并请求数据的分区及每个分区行数的处理.

其实这里就是重点核心部分了!我要划重点啦~

####5.1 看盘点记录界面, 就是一个TableView, 那么我们创建一个保存数据的数组timeList, 这个数组是外层列表数组(分区时间数组).

@property (nonatomic, strong) NSMutableArray *timeList;
复制代码
- (NSMutableArray *)timeList {if (!_timeList) {_timeList = [NSMutableArray array];}return _timeList;
}
复制代码

**PS: 切记!!!**千万不要再创建内层数组,容易把自己绕糊涂, 有了外层数组,需要内层数组数据时是可以通过外层数组 timeList 去获取的.譬如行数据:model.inventoryList2[indexPath.row]

####5.2 拿到数组后, 就可以考虑分区数目及当前分区下 cell 数目

#pragma mark - Table view data source- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {self.tableView.mj_footer.hidden = self.timeList.count == 0;return self.timeList.count;
}- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {YYPInventoryRecordModel *model = self.timeList[section];return model.inventoryList2.count;
}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {YYPInventoryRecordDetailCell *detailCell = [YYPInventoryRecordDetailCell cellWithTableView:tableView];if (self.timeList.count) { // 有时候传值为nilYYPInventoryRecordModel *model = self.timeList[indexPath.section];YYPRecordDetailsModel *detailModel = model.inventoryList2[indexPath.row];detailCell.model = detailModel;}return detailCell;
}#pragma mark - UITableViewDelegate- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(nonnull NSIndexPath *)indexPath {return YYPInventoryRecordDetailCellHeight;
}
复制代码

####5.3 这个时候盘点记录的 cell详情出来了, 接着考虑header的界面及数据. 在viewForHeaderInSection里创建

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section ;
复制代码

赋值取当前一级 Model 下字段: [[_timeList objectAtIndex:section] valueForKey:@"dotime"]];

 dotime.text = [NSString stringWithFormat:@"%@", [[_timeList objectAtIndex:section] valueForKey:@"dotime"]];
复制代码

分区Header内容也是由外层 Model 赋值的, 返回每个分区的内容self.timeList[section]

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {return self.timeList[section];
}
复制代码

####5.4 由于我们还有下个跳转页面,同时还是取当前接口数据, 这个时候我们就要找到相对应的分区去跳转即可.

在cell 点击跳转相对来说方便的多,因为这个有系统方法didSelectRowAtIndexPath.只需要找到相对应分区self.timeList[indexPath.section]

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {YYPInventoryRecordModel *model = self.timeList[indexPath.section];YYPRecordDetailsController *vc = [[YYPRecordDetailsController alloc] init];vc.inventoryList = model.inventoryList;[self.navigationController pushViewController:vc animated:YES];
}
复制代码

若是header 上也要实现按钮跳转, 可以在viewForHeaderInSection方法里的按钮上加个标记与header的分区section一致, 然后找到相对应分区**self.timeList[sender.tag]**就好.

 inIcon.tag = section;
复制代码

实现跳转方法

- (void)btnClick:(UIButton *)sender {// 用 tag 来标记sectionYYPInventoryRecordModel *model = self.timeList[sender.tag];YYPRecordDetailsController *vc = [[YYPRecordDetailsController alloc] init];vc.inventoryList = model.inventoryList;[self.navigationController pushViewController:vc animated:YES];
}
复制代码

####5.5 最后就是请求了.

拿到最外层的数组数据就好.

[weakSelf.timeList removeAllObjects];
NSArray *currentPageArray = [YYPInventoryRecordModel loadInventoryRecordInfoFromJson:json[@"data"]];
[weakSelf.timeList addObjectsFromArray:currentPageArray];
复制代码

至于上拉加载更多数据/下拉刷新新数据 及 网络不佳状态重新加载获取请求这些都是按自己项目需求添加的. 这里就不一一展示了.

##Step6. 跳转控制器内层数组的传值简单实现. 这其实就是一个简单的正常的 MVC. 就是不需要请求接口,就是正向传值带回来一个数组. .h 里露出一个属性便于传值.

// 详情全部数据
@property (nonatomic, strong) NSArray *inventoryList;
复制代码

在. m 里创建一个保存接收数据的可变数据

// 详情全部数据
@property (nonatomic, strong) NSMutableArray *goodList;
复制代码

需要加载inventoryList数据带回到goodList.

#pragma mark - 懒加载- (NSMutableArray *)goodList {if (!_goodList) {_goodList = [NSMutableArray array];[_goodList addObjectsFromArray:_inventoryList];}return _goodList;
}
复制代码

简单的Table view data source方法:

#pragma mark - Table view data source- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {return self.goodList.count;
}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {YYPRecordDetailsCell *cell = [YYPRecordDetailsCell cellWithTableView:tableView];if (self.goodList.count) { // 有时候传值为nilYYPRecordDetailsModel *model = self.goodList[indexPath.row];cell.model = model;}return cell;
}
复制代码

这个时候,完整测试下效果吧:

如果需要看订单详情页那种Model 套 Model 的请移步: Model套Model之iOS模型闲聊

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

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

相关文章

输入法画面_搜狗输入法:用AI技术谱写诗意生活

十九世纪著名的思想家斯宾塞曾说&#xff1a;科学本身就富有诗意。这里应该包含两种意思&#xff0c;字面上&#xff0c;科学是饱含文字之美的&#xff0c;比如原理和规律的推演&#xff0c;仅通过文字符号的简单排列&#xff0c;便有了生机。但深层次上科学又不止于文字&#…

hadoop伪分布式(单机版)安装,Linux

一、下载 1、hadoop官网下载&#xff1a;https://archive.apache.org/dist/hadoop/common/ 进入stable文件夹里下载&#xff0c;这是稳定版本。 stable/ 本文的版本是 hadoop-2.7.2.tar.gz 2、jdk下载&#xff0c;JDK7及以上&#xff0c;本文用jdk8-64位 二、版本区别 2.…

c++-add two numbers 两个链表相加

题目描述 You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list. Input: (2 -> 4 -> 3) (5 -> 6…

城轨的两类时钟系统均同步于_基于两台SDS3000示波器同步产生“8通道”示波器...

在很多应用场合需要4通道以上的示波器&#xff0c;但是市面上极大部分示波器最多只有四通道&#xff0c;而且没有外部输入的同步时钟接口。 有什么快捷的方法获得更多通道功能的示波器&#xff1f; 最简便的方法是:将两台示波器的辅助输入信号作为触发源&#xff0c;同时连接到…

Linux设置ssh免密码登录

一、SSH来源 对于需要远程管理其它机器&#xff0c;一般使用远程桌面或者telnet。linux一般只能是telnet。但是telnet的缺点是通信不加密&#xff0c;存在不安全因素&#xff0c;只适合内网访问。 为解决这个问题&#xff0c;推出了通信加密通信协议&#xff0c;即SSH&#x…

解析json数据_Retrofit同时解析JSON和XML数据格式

前言Android开发中&#xff0c;我们会经常遇到前端需要解析两种数据格式(json和xml),比如自己服务器返回的是json格式的数据&#xff0c;我们做微信登录的时候&#xff0c;微信返回的格式又是xml格式的。我们可以通过自己编写Retrofit的ConverterFactory来做到可以同时解析两种…

ORACLE 小时值必须介于1和12之间 解决方法

ORACLE数据库查询语句&#xff1a; "select * from dual where time>to_date(2012-10-29 19:45:34,yyyy-mm-dd HH:mi:ss)"当执行时&#xff0c;会抛出错误&#xff1a;ORA-01849: 小时值必须介于 1 和 12 之间 01849. 00000 - "hour must be between 1 and 1…

jenkins+svn+maven+ssh 部署配置详细记录

2019独角兽企业重金招聘Python工程师标准>>> 先简单记录一下&#xff0c;后面再慢慢完善。 1、环境 jdk 1.7.0_45 maven 3.1.1 jenkins 2.3.21 jdk和maven的安装就不必多说了&#xff0c;主要是jenkins的安装需要说下&#xff0c;jenkins有war包和yum还有rpm等安装方…

k8s安装sqlite3_kubernetes环境部署单节点redis数据库的方法

kubernetes部署redis数据库(单节点)redis简介Redis 是我们常用的非关系型数据库&#xff0c;在项目开发、测试、部署到生成环境时&#xff0c;经常需要部署一套 Redis 来对数据进行缓存。这里介绍下如何在 Kubernetes 环境中部署用于开发、测试的环境的 Redis 数据库&#xff0…

oracle 都是parallel惹的祸【1-2分钟出结果变1-2秒】

原文&#xff1a;http://blog.csdn.net/shushugood/article/details/9000628 -------------------------------------------------------- 该项目是中国联通xxxx话务系统&#xff0c;我的架构设计需求设计&#xff0c;运维保障数据库开发&#xff0c;全套服务。 在今天开发完毕…

二叉搜索树(BST树)的简单实现

#include <stdlib.h>template<typename T>class CBinSTree;template <typename T>class CTreeNode{//树节点类public:CTreeNode(const T& item,CTreeNode<T>* lptr NULL,CTreeNode<T>* rptr NULL):data(item),left(lptr),right(rptr){}CTr…

Oracle 创建 DBLink 的方法

原文出处&#xff1a;http://blog.csdn.net/davidhsing/article/details/6408770 ------------------- 1、如果需要创建全局 DBLink&#xff0c;则需要先确定用户有创建 dblink 的权限&#xff1a; [c-sharp] view plaincopy print?select * from user_sys_privs where privi…

eclipse init 配置

--设置最大的堆和最小堆大小.两者一样表示固定大小.这样可以防止老年代内存扩展造成额外的gc.当然也会多占一些内存.系统内存不足的慎用 -Xms512m -Xmx512m --加大年轻代内存.减少minor gc -Xmn164m --这个是永久代大小.默认是64M,增加到96M.固定大小,减少扩展造成的gc -XX:Per…

Oracle对表空间操作的sql

管理员给用户增加不限制表空间权限 grant unlimited tablespace to 用户; 查看表空间使用情况 SELECT a.tablespace_name "表空间名", total "表空间大小", free "表空间剩余大小", (total - free) "表空间使用大小", total / (…

IPKISS Tutorials------线路仿真

IPKISS------线路仿真 推荐阅读引言正文示例1------PDK中集成好的器件示例2------使用 i3.Circuit 框架示例3------i3.PCell 框架推荐阅读 Matplotlib ------ 纵坐标科学计数法含义 引言 我们知道,想要在 IPKISS 中进行仿真,首先需要对线路进行定义,但是我们知道,在 IPK…

Oracle Database 11g Express Edition使用限制,与其他版本的区别

Oracle Database 11g Express Edition是 Oracle 数据库的免费版本&#xff0c;支持标准版的大部分功能&#xff0c;11g Express Edition 提供 Windows 和 Linux 版本。 做为免费的 Oracle 数据库版本&#xff0c;Express Edition的限制是&#xff1a; 1&#xff09;最大数据库大…

c++ 复制构造函数_C++学习刷题8--复制构造函数和赋值运算符重载函数

一、前言本部分为C语言刷题系列中的第8节&#xff0c;主要讲解这几个知识点&#xff1a;复制构造函数和赋值运算符重载函数。欢迎大家提出意见、指出错误或提供更好的题目&#xff01;二、知识点讲解知识点1&#xff1a;复制构造函数1、当依据一个已存对象创建一个新对象时&…

ORACLE使用WITH AS和HINT MATERIALIZE优化SQL解决FILTER效率低下

原文&#xff1a;http://blog.csdn.net/liangweiwei130/article/details/37882503 ------------------------------------------------- 在做项目的过程中&#xff0c;一个页面使用类似如下的SQL查询数据&#xff0c;为了保密和使用方便&#xff0c;我把项目中有关的表名和字段…

面试题333

2019独角兽企业重金招聘Python工程师标准>>> 面试题333 博客分类&#xff1a; java 1、spring的缓存,mybatis缓存2、介绍下dubbo。A服务调用B服务&#xff0c;B服务又调用C服务,这种情况怎么办3、JVM监控工具有哪些&#xff0c;区别又是什么&#xff08;如能追上各个…

mysql vfp_用 VFP 连接 MYSQL 数据库

今天试了一下用 Visual FoxPro 连接 MySQL 数据库。首先在自己机子上架设 MySQL 数据库&#xff0c;就不多说了&#xff0c;我是直接用 XAMPP 架设的服务器。然后在 VFP 里输入命令&#xff1a;sqlhandle SQLSTRINGCONNECT("driver{MySQL ODBC 5.1 Driver};server127.0.0…