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

  >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. 射击的乐趣:WIN32诠释打飞机游戏源码补充

    打飞机游戏源码补充 从指定位置加载bmp并显示到对话框. , TRUE);, , LR_LOADFROMFILE);          {         BITMAP bmpinfo;        ...

  2. iOS新特性引导页

    有一个注意点: 获取版本号 个叫做Version,一个叫做Build,这两个值都可以在Xcode 中选中target,点击"Summary"后看到. Version在plist文件 ...

  3. 在Linux下安装C/C++开发工具包的最佳方式

    假设你使用的是Fedora, Red Hat, CentOS, 或者 ScientificLinux 系统,使用以下的命令安装GNU的C/C++开发包和编译器. # yum groupinstall ...

  4. FloatingActionButton

    https://github.com/Clans/FloatingActionButton    

  5. web运维第一篇:nginx配置文件详解笔记

    #定义Nginx运行的用户和用户组 user www www; #nginx进程数,建议设置为等于CPU总核心数. worker_processes 8; #全局错误日志定义类型,[ debug | ...

  6. [置顶] MySQL Cluster初步学习资料整理--安装部署新特性性能测试等

    1.1 mysql-cluster简介 简单的说,MySQLCluster实际上是在无共享存储设备的情况下实现的一种完全分布式数据库系统,其主要通过NDBCluster(简称NDB)存储引擎来实现. ...

  7. [Practical Git] Show who changed a line last with git blame

    When working on a file, we often want to know who made certain changes last; we can use git blame to ...

  8. careercup-中等难度 17.12

    17.12 设计一个算法,找出数组中两数之和为指定值的所有整数对. 解答 时间复杂度O(n)的解法 我们可以用一个哈希表或数组或bitmap(后两者要求数组中的整数非负)来保存sum-x的值, 这样我 ...

  9. [Effective C++ --009]确定对象被使用前已先被初始化

    在确保对象在使用前已先被初始化这一条款的编码实践中,作者为我们总结了三条经验,它们分别是: ------------------------------------------------------ ...

  10. requestCode 和 resultCode .

    OK,代码如上,可能这个时候还会有点疑问,关于参数的疑问.直接看android sdk 帮助说得更清楚.我发现网上有些文章还有吧 requestCode 和 resultCode 混淆说明错的. st ...