思路:架构的设计模式主要有这么两种

  >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布局页面的更多相关文章

  1. Android UI开发第二十七篇——实现左右划出菜单

    年前就想写左右滑动菜单,苦于没有时间,一直拖到现在,这篇代码实现参考了网上流行的SlidingMenu,使用的FrameLayout布局,不是扩展的HorizontalScrollView. 程序中自 ...

  2. 第二十七篇-新建Activity

    新建Activity实现页面之间的跳转与传值. layout1.xml <?xml version="1.0" encoding="utf-8"?> ...

  3. 第二十七篇 -- QTreeWidget总结

    前言 之前写过几篇关于TreeWidget的文章,不过不方便查阅,特此重新整合作为总结.不过关于QtDesigner画图,还是不重新写了,看 第一篇 就OK. 准备工作 1. 用QtDesigner画 ...

  4. flask第二十七篇——九九乘法表

    请关注公众号:自动化测试实战 九九乘法表其实很容易: <table border="1"> <tbody> {% for x in range(1, 10) ...

  5. 第二十七篇:Windows驱动中的PCI, DMA, ISR, DPC, ScatterGater, MapRegsiter, CommonBuffer, ConfigSpace

    近期有些人问我PCI设备驱动的问题, 和他们交流过后, 我建议他们先看一看<<The Windows NT Device Driver Book>>这本书, 个人感觉, 这本书 ...

  6. Python之路【第二十七篇】:web服务器django

    Django 一.web框架 框架,即时framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单的说,就是用别人搭建好的舞台来表演你的才艺 ...

  7. 第二十七篇:SOUI中控件属性查询方法

    SOUI项目的SVN根目录下有一个doc目录,下面有一份控件属性表.包含了大部分控件的大部分属性,不过也不一定完全准确.最保险的办法还是查源代码. SOUI对象包含控件及ISkinObj等从SObje ...

  8. Python之路(第二十七篇) 面向对象进阶:内置方法、描述符

    一.__call__ 对象后面加括号,触发执行类下面的__call__方法. 创建对象时,对象 = 类名() :而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()( ...

  9. 第二十七篇 玩转数据结构——集合(Set)与映射(Map)

          1.. 集合的应用 集合可以用来去重 集合可以用于进行客户的统计 集合可以用于文本词汇量的统计   2.. 集合的实现 定义集合的接口 Set<E> ·void add(E) ...

随机推荐

  1. PCB编辑快捷键

    TAB: 调节属性PgUp: 放大PgDn: 缩小Delete: 删除Ctrl+C: 复制Ctrl+V: 粘贴Ctrl+X: 剪贴Ctrl+Z: 撤销Ctrl+Y: 取消撤销Ctrl+F: 查找Ctr ...

  2. 没有指针的java语言

    一.java中引用(reference)实质就是指针 与C语言的指针比较: 1.引用是受控的安全的 2.空引用会被检查 java中不能够访问没有引用到的内存,这也是java的自动垃圾回收机制的基础之一 ...

  3. 【P3O是什么】P3O认证之项目组合、项目群和项目办公室

    如何区分项目组合办公室与项目群和项目办公室? P3O®(Portfolio,Programmed and Project Offices-项目组合.项目群和项目办公室)是由英国商务部 OGC 于200 ...

  4. oracle强制使用索引

    select /*+ INDEX(表名,索引名称) */ col_1,...from xxx

  5. Remastersys打包你自己的ubuntu成iso文件,保存原来的所有配置

    你是不是辛辛苦苦地配好了ubuntu结果不久又重装,然后又重新配置很久呢? 笔者好不容易配置好了torch,但是换硬盘,于是就想到了将ubuntu打包成iso文件,下次直接安装,然后配置好的东西都搬过 ...

  6. android开发 Fragment嵌套调用常见错误

    在activity中有时须要嵌套调用fragment,但嵌套调用往往带来视图的显示与预期的不一样或是fragment的切换有问题.在使用时要注意几点: 1.fragment中嵌套fragment,子f ...

  7. android131 360 05 手势触摸滑动,sim卡,开机启动的广播,手机联系人,SharedPreferences,拦截短信

    安卓手势触摸滑动: package com.itheima52.mobilesafe.activity; import android.app.Activity; import android.con ...

  8. Ext.Net 问题收集

    Ext.Net DateField只显示年月 <ext:DateField runat="server" Format="yyyy-MM"> < ...

  9. java_包含抽象方法的枚举类

    package ming; enum Operation { PLUS { public double eval(double x, double y) { return x + y; } }, MI ...

  10. WebAPI返回JSON的正确格式

    最近打算用WebAPI做服务端接口,返回JSON供ANDROID程序调用,结果试了好几次JSONObject都无法解析返回的JSON字符串.看了一下服务端代码: public string Get() ...