類似索引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.pswp.cn/news/539749.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539749.shtml
英文地址,請注明出處:http://en.pswp.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…