MVVM框架思想


1.MVVM是什么?
M:模型
V:視圖
VM:視圖模型

 

 

 

簡單理解:mvc是一個cell面向一個model開發
mvvm是一個cell面向一個viewModel開發, viewModel里面又包含model
mvvm優點:抽取方法更加的詳細,業務邏輯划分更加明確,讓控制器更加輕量級
缺點:不利於維護,可讀性不太好

2.MVVM框架的使用(以計算不等高cell為例)
上面的分析指導,計算cell高度要在網絡請求里面記性

2.1自定義一個topView模型
定義成員屬性接收服務器返回(要展示到view上)的數據

2.2自定義一個viewModel模型
先定義一個topView的模型屬性,來保存模型數據
在定義一些屬性,來保存計算出來的數據(比如:cell的高度和frame)

2.3數據請求成功,先把我們需要的字典數組轉成模型數組

2.4再把模型數組轉換成 視圖模型 數組,並保存起來(定義一個數組成員變量)

1 // 模型轉視圖模型
2 for (XMGThemeItem *item in themes) {
3 XMGThemeViewModel *vm = [[XMGThemeViewModel alloc] init];
4 // 計算cell子控件frame和cellH
5 vm.item = item;
6 [self.themeViewModels addObject:vm];

注意:給視圖模型賦值的時候(vm.item = item;),會觸發視圖模型成員屬性item的set方法
我們就是在item的set方法里面計算cell的frame和高度的,
也就是說,模型全部轉為視圖模型之后,cell的frame和高度已經全部確定了
只需要在視圖模型定義成員屬性保存frame和高度,用的這時候直接取就可以了

3.怎么展示數據?

3.1在自定義cell里面定義 一個視圖模型來接收數據

3.2在cellForRow方法里面給cell的視圖模型賦值(通過從數組中取出對應的視圖模型)

1 cell.vm = _themeViewModels[indexPath.row];

 

3.3在給cell的視圖模型賦值的時候,會觸發vm的set方法,會調用vm的set方法
在set方法里面給topView的模型賦值,並取出cell的frame和高度

1 - (void)setVm:(XMGThemeViewModel *)vm
2 {
3 _vm = vm;
4 // topView:傳遞模型
5 _topView.item = vm.item;
6 // 設置topViewFrame
7 _topView.frame = vm.topViewFrame;
8 }

 

3.4怎么給模型賦值(也就是展示數據)
在setVm方法里面會觸發模型的set方法_topView.item = vm.item;
也就是說,這句代碼,就把視圖模型保存的服務器數據,傳遞給topView中定義的模型屬性

3.5在topView的item的set方法里面,我們完成給cell的子控件賦值的過程

1 - (void)setItem:(XMGThemeItem *)item
2 {
3 _item = item;
4 
5 [_iconView sd_setImageWithURL:[NSURL URLWithString:item.profile_image]];
6 _nameView.text = item.name;
7 _timeView.text = item.create_time;
8 _textView.text = item.text;
9 }

 

topView的這些子控件通過從xib連線獲得

3.6在哪里給cell的高度賦值?
在heightForRow方法里面

1 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;0


1
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 2 { 3 XTThemeViewModel *vm = _themeViewModels[indexPath.row]; 4 return vm.cellH; 5 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM