第二十七篇、使用MVVM布局页面
思路:架构的设计模式主要有这么两种
>MVC :这种方式用得很多,也很是常见,不在过多的介绍
>MVVM:使用这种 常常需要导入第三方框架,常见的是响应式框架
>主要讲一下ViewModel : ViewModel 主要管理的使用是一些(不归类于Model 或者 Controller)的业务逻辑,常见的是一些网络请求,布局的一些逻辑
下面还是举个简单明了的例子好了!MVVM来了。。。
先Model(模型)
@interface MyAssetsModel : NSObject @property (nonatomic,copy) NSString *typeStr;//现金余额,路费宝余额
@property (nonatomic,copy) NSString *detailStr;//现金明细,路费宝明细
@property (nonatomic,copy) NSString *money;
@property (nonatomic,copy) NSString *getMoney;//余额提现,兑换现金
@property (nonatomic,copy) NSString *desc;//描述 @end
ViewModel的.h文件(主要用来处理一些不归类为Controller和Model,如网络请求等等)
#import <Foundation/Foundation.h>
#import "MyAssetsModel.h"
@interface MyAssetsViewModel : NSObject @property (nonatomic, copy) NSString *cellName; @property (nonatomic, copy) NSString *cellId; @property (nonatomic, assign) CGFloat cellheight; - (instancetype)initWidthModel:(MyAssetsModel *)model; @end
.m文件
@implementation MyAssetsViewModel - (instancetype)initWidthModel:(MyAssetsModel *)model
{
MyAssetsViewModel *viewModel = [[MyAssetsViewModel alloc] init]; viewModel.cellName = @"MyAssetsTableViewCell";
viewModel.cellId = @"MyAssetsTableViewCellId";
viewModel.cellheight = [NSString sizeWithString:model.desc font:[UIFont systemFontOfSize:[PublicUnit CGRectMakeX:]] ParagrapGap:[PublicUnit CGRectMakeX:] withMaxSize:CGSizeMake(SCREEN_WIDTH- [PublicUnit CGRectMakeX:], )].height+[PublicUnit CGRectMakeX:]; return viewModel;
} @end
下面是Controller(控制器)
#import "FPHMyAssetsViewController.h"
#import "MyAssetsTableViewCell.h"
#import "MyAssetsModel.h"
#import "MyAssetsViewModel.h"
#import "FPHBalanceVC.h"
#import "FPHDrawCashVC.h"
#import "FPHRuleCashVC.h"
@interface FPHMyAssetsViewController ()<UITableViewDelegate,UITableViewDataSource> @property (nonatomic,strong) UITableView *tableView;
@property (nonatomic,strong) NSMutableArray *dataArray;
@property (nonatomic,strong) NSMutableArray *dataViewModelArray; @end @implementation FPHMyAssetsViewController - (void)viewDidLoad {
[super viewDidLoad];
[self setBaseView];
[self registCell];
}
- (void)setBaseView
{
self.title = @"我的资产";
[self.view addSubview:self.tableView];
[self requestWalletRecord]; } - (void)registCell
{
[self.tableView registerClass:[MyAssetsTableViewCell class] forCellReuseIdentifier:@"MyAssetsTableViewCellId"]; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.dataArray.count;
} - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
MyAssetsViewModel *viewModel = _dataViewModelArray[indexPath.row];
if (!viewModel) {
return nil;
} if ([viewModel.cellName isEqualToString:@"MyAssetsTableViewCell"]) { MyAssetsTableViewCell *cell = (MyAssetsTableViewCell*)[tableView dequeueReusableCellWithIdentifier:viewModel.cellId forIndexPath:indexPath];
[cell cellFilledWithModel:_dataArray[indexPath.row]];
cell.myAssetsBlock = ^(MyAssetsModel *model){
if ([model.getMoney isEqualToString:@"余额提现"]) {
[NSUserDefaults setInteger: forKey:RightNow];
NSString *money = model.money;
[NSUserDefaults setFloat:[money floatValue] forKey:CrashMoney];
FPHDrawCashVC *vc = [[FPHDrawCashVC alloc] init];
[[self navigationController] pushViewController:vc animated:YES];
}else
{
[NSUserDefaults setInteger: forKey:RightNow];
NSString *money = model.money;
[NSUserDefaults setFloat:[money floatValue] forKey:CrashMoney];
FPHRuleCashVC *vc = [[FPHRuleCashVC alloc] init];
[self.navigationController pushViewController:vc animated:YES];
}
}; return cell;
} return nil; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
MyAssetsViewModel *viewModel = self.dataViewModelArray[indexPath.row];
return viewModel.cellheight;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{ if (indexPath.row == ) {
FPHBalanceVC *vc = [[FPHBalanceVC alloc] init];
vc.balanceStatus = ;
[self.navigationController pushViewController:vc animated:YES];
}else{ FPHBalanceVC *vc = [[FPHBalanceVC alloc] init];
vc.balanceStatus = ;
[self.navigationController pushViewController:vc animated:YES]; }
} #pragma mark --
#pragma mark -- setter and getter
- (UITableView *)tableView
{
if (!_tableView) {
_tableView = [[UITableView alloc] initWithFrame:CGRectMake(, , SCREEN_WIDTH, SCREEN_HEIGHT)];
_tableView.delegate = self;
_tableView.dataSource = self;
_tableView.backgroundColor = UIColorWithHexRGB(0xf5f5f5);
_tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
_tableView.tableHeaderView = [self addHeader];
}
return _tableView;
} //tableview header
- (UIView *)addHeader
{
UIView *header = [[UIView alloc] initWithFrame:CGRectMake(, , SCREEN_WIDTH, [PublicUnit CGRectMakeX:])];
UIImageView *imgView = [[UIImageView alloc] initWithFrame:header.bounds];
imgView.image = [UIImage imageNamed:@"bg_mymoney"];
[header addSubview:imgView];
return header;
} - (NSMutableArray *)dataArray
{
if (!_dataArray) {
_dataArray = [NSMutableArray array];
MyAssetsModel *model1 = [[MyAssetsModel alloc] init];
model1.typeStr =@"现金余额";
model1.detailStr = @"现金明细";
model1.money = @"0.00";
model1.getMoney = @"余额提现";
model1.desc = @"现金余额可以及时转出提现,直接转到自己的银行卡或支付宝。";
[_dataArray addObject:model1];
MyAssetsModel *model2 = [[MyAssetsModel alloc] init];
model2.typeStr =@"路费宝余额";
model2.detailStr = @"路费宝明细";
model2.money = @"802.00";
model2.getMoney = @"兑换现金";
model2.desc = @"路费宝主要通过领路费、分享楼盘、邀请好友看房以及参与房品汇活动获得。路费宝只能兑换到现金余额,每次兑换必须是68的倍数。";
[_dataArray addObject:model2];
}
return _dataArray;
} - (NSMutableArray *)dataViewModelArray
{
if (!_dataViewModelArray) {
_dataViewModelArray = [NSMutableArray array];
for (MyAssetsModel *model in self.dataArray) {
MyAssetsViewModel *viewModel = [[MyAssetsViewModel alloc] initWidthModel:model];
[_dataViewModelArray addObject:viewModel];
}
}
return _dataViewModelArray;
}
第二十七篇、使用MVVM布局页面的更多相关文章
- Android UI开发第二十七篇——实现左右划出菜单
年前就想写左右滑动菜单,苦于没有时间,一直拖到现在,这篇代码实现参考了网上流行的SlidingMenu,使用的FrameLayout布局,不是扩展的HorizontalScrollView. 程序中自 ...
- 第二十七篇-新建Activity
新建Activity实现页面之间的跳转与传值. layout1.xml <?xml version="1.0" encoding="utf-8"?> ...
- 第二十七篇 -- QTreeWidget总结
前言 之前写过几篇关于TreeWidget的文章,不过不方便查阅,特此重新整合作为总结.不过关于QtDesigner画图,还是不重新写了,看 第一篇 就OK. 准备工作 1. 用QtDesigner画 ...
- flask第二十七篇——九九乘法表
请关注公众号:自动化测试实战 九九乘法表其实很容易: <table border="1"> <tbody> {% for x in range(1, 10) ...
- 第二十七篇:Windows驱动中的PCI, DMA, ISR, DPC, ScatterGater, MapRegsiter, CommonBuffer, ConfigSpace
近期有些人问我PCI设备驱动的问题, 和他们交流过后, 我建议他们先看一看<<The Windows NT Device Driver Book>>这本书, 个人感觉, 这本书 ...
- Python之路【第二十七篇】:web服务器django
Django 一.web框架 框架,即时framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单的说,就是用别人搭建好的舞台来表演你的才艺 ...
- 第二十七篇:SOUI中控件属性查询方法
SOUI项目的SVN根目录下有一个doc目录,下面有一份控件属性表.包含了大部分控件的大部分属性,不过也不一定完全准确.最保险的办法还是查源代码. SOUI对象包含控件及ISkinObj等从SObje ...
- Python之路(第二十七篇) 面向对象进阶:内置方法、描述符
一.__call__ 对象后面加括号,触发执行类下面的__call__方法. 创建对象时,对象 = 类名() :而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()( ...
- 第二十七篇 玩转数据结构——集合(Set)与映射(Map)
1.. 集合的应用 集合可以用来去重 集合可以用于进行客户的统计 集合可以用于文本词汇量的统计 2.. 集合的实现 定义集合的接口 Set<E> ·void add(E) ...
随机推荐
- Thinking in java——Generics
Ordinary classes and methods work with specific types: either primitives or class types. If you are ...
- EasyUI datagrid自适应问题解决
在使用js 动态创建EasyUI datagrid时,如果设置fit为true,在显示的时候数据的高度为固定高度不能自适应 解决办法是把fit设为false. 但这样设置后又有个问题,如果把colum ...
- 如何创建一个有System用户权限的命令行
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:如何创建一个有System用户权限的命令行.
- CentOS 6.5 下载地址
CentOS 6.5 主要改动 Precision Time Protocol(精确时间协议)—— 原先是项技术预览 —— 现在已获全面支持.以下驱动程序支持网络时间戳印:bnx2x.tg3.e100 ...
- HDU 2112 HDU Today -- from lanshui_Yang
此题主要是要用到字符串向整数的映射 , 很自然的想到了 STL 中的map ,哎,贡献无数次WA,最后才发现每次运行时 map 忘了清空 !!!!本题,用dijkstra 和 spfa 均可 ,但是要 ...
- java常见面试题
JAVA相关基础知识 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分 ...
- U盘安装SLES的方法
安装准备: 一个4G 或 大于4G的U盘 也同样适合移动硬盘, SLES-11-DVD-i586-GM-DVD1.iso 文件1) 将U盘格式化成FAT32格式; 2) 下载 syslinux工具 h ...
- uva 624 CD 01背包打印路径
// 集训最终開始了.来到水题先 #include <cstdio> #include <cstring> #include <algorithm> #includ ...
- [Practical Git] Filter commit history with git log arguments
In the last lesson, we learned how to format the git log output; in this lesson we will learn how to ...
- oracle之单行函数
单行函数 ①.字符函数 LOWER(x):将x中的每一个单词都转换成小写 UPPER(x):将x中的每一个单词都转换成大写 INITCAP(x): 将x中的每一个单词的首字母转换成大写 CONC ...