第二十七篇、使用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) ...
随机推荐
- 第二十章、启动流程、模块管理与 Loader grub
Boot Loader: Grub 『 boot loader 是加载核心的重要工具』!没有 boot loader 的话,那么 kernel 根本就没有办法被系统加载! boot loader 的两 ...
- Linq知识小结
Linq语法小结:有两种形式的语法可供我们在写Linq查询时使用,分别是“查询语法”.“方法语法”.1)先看个列子,有个直观认识 int[] arr = { 12, 2,45,34,23,18 ...
- 【Stage3D学习笔记续】山寨Starling(八):核心优化(批处理)的实现
批处理是使GPU进行高效绘制的一种技术手段,也是整个渲染流程中最核心的技术,到目前为止我们并没有使用到这种技术手段,下面我们看看我们现在的渲染机制. 先想一想我们最开始是怎么向GPU绘制一幅图像的,可 ...
- mac svn的替代品CornerStone
推荐mac CornerStone客户端图形软件,类似windows下svn tortoise. 一.下载地址 : http://bbs.feng.com/read-htm-tid-7936664.h ...
- JavaScript Source Map 详解
源码地址: http://www.ruanyifeng.com/blog/2013/01/javascript_source_map.html 上周,jQuery 1.9发布. 这是2.0版之前的最后 ...
- 关于python文件操作 (转载)
总是记不住API.昨晚写的时候用到了这些,但是没记住,于是就索性整理一下吧: python中对文件.文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块. 得到当前工作目录,即当前Pyth ...
- 【44】将与参数无关的代码抽离templates
1.template是产生代码的代码,这就意味着源码看起来很少,生成的目标码大量膨胀. 2.考虑,如果两个方法有重复代码,我们会新建一个方法,把重复的代码放进去,原先两个方法调用第三个方法.如果两个类 ...
- ThinkPHP3.2.3新特性之:数据库设置
ThinkPHP3.2.3版本数据库驱动采用PDO完全重写,配置和使用上面也比之前版本更加灵活和强大,我们来了解下如何使用. 首先,3.2.3的数据库配置信息有所调整,完整的数据库设置包括: /* 数 ...
- Codeforces Round #324 (Div. 2) E. Anton and Ira 贪心
E. Anton and Ira Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/584/probl ...
- WCF的ABC
首先: WCF的全称是Windows Communication Foundation,Windows通信基础的意思,是Microsoft为构建面向服务的应用程序而提供的统一编程模型,它整合.NET平 ...