1.话说,本来想做个聚合查询功能。可是我的重点想研究xmpp聊天功能。所以使用mvvm模式做了全然模式51job主界面的页面。

2.首先给大家看我执行起来的界面。

3.界面非常easy,做这个界面主要是为了比較mvvm模式和mvc模式之间的差别。

4.这个界面的结构是下边这张图片

与mvc相比,我多了一个viewmodel文件。

mvc之前是把业务逻辑和数据放在viewcontroller里边,逻辑复杂的话,别人维护起来非常麻烦。

我就不贴viewcontroller的图片了,我把这个代码上传给大家,大家能够看看,和mvc相比,是不是非常easy维护。代码层级会好一些。明天開始研究iosxmpp的聊天功能,所以会暂停一段时间更新。

没办法,看来仅仅能贴代码了,我仅仅贴viewcontroller和viewmodel的代码。大家能够比較下。

这是viewcontroller

#import <UIKit/UIKit.h>

@class MTSOnlineViewModel;

@interface MTSOnlineViewController :UITableViewController

@property(strong,nonatomic)MTSOnlineViewModel *onlineViewModel;

@end


#import "MTSOnlineViewController.h"

#import "MTSOnlineViewModel.h"

#import "MTSOnlineMenuCell.h"

@interface
MTSOnlineViewController()<MTSOnlineMenuDelegate>

@end

@implementation MTSOnlineViewController

#pragma mark - UIViewController Overrides

- (void)awakeFromNib

{

[superawakeFromNib];

}

- (void)viewDidLoad

{

[superviewDidLoad];

self.onlineViewModel=[[MTSOnlineViewModelalloc]
init];

[self.tableViewsetRowHeight:130.0f];

[self.tableViewsetSeparatorStyle:UITableViewCellSeparatorStyleNone];

@weakify(self);

[self.onlineViewModel.updatedContentSignalsubscribeNext:^(id
x) {

@strongify(self);

[self.tableViewreloadData];

}];

}

-(void)viewWillAppear:(BOOL)animated {

[superviewWillAppear:animated];

self.onlineViewModel.active =YES;

}

#pragma mark - Table View

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{

return [self.onlineViewModelnumberOfItems];

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath
*)indexPath

{

MTSOnlineMenuCell *cell = [tableViewdequeueReusableCellWithIdentifier:@"onlinecell"forIndexPath:indexPath];

cell.selectionStyle=UITableViewCellSelectionStyleNone;

cell.delegate=self;

];

return cell;

}

#pragma mark --cell delegate

-(void)pressMenuButton:(MTSMenuType)type title:(NSString*)title;

{

[[[UIAlertViewalloc]
initWithTitle:@"button測试"message:title
delegate:nilcancelButtonTitle:@"确认"otherButtonTitles:nil,nil]
show];

}

@end


这是viewmodel

#import "RVMViewModel.h"

@interface MTSOnlineViewModel :RVMViewModel

@property (nonatomic,readonly)
RACSignal *updatedContentSignal;

@property (nonatomic,readonly)
NSMutableArray *tableDataSource;

-(NSInteger)numberOfItems;

@end


#import "MTSOnlineViewModel.h"

#import "MTSMenuModel.h"

@interface
MTSOnlineViewModel ()

@property (nonatomic,strong)
RACSubject *updatedContentSignal;

@property (nonatomic,strong)
NSMutableArray *tableDataSource;

@end

@implementation MTSOnlineViewModel

-(instancetype)init {

self = [superinit];

if (self ==nil)
returnnil;

self.updatedContentSignal = [[RACSubjectsubject]
setNameWithFormat:@"MTSOnlineViewModel updatedContentSignal"];

self.tableDataSource = [[NSMutableArrayalloc]
init];

@weakify(self)

[self.didBecomeActiveSignalsubscribeNext:^(id
x) {

@strongify(self);

[selfmenuDataSource];

}];

return
self;

}

#pragma mark - Public Methods

-(NSInteger)numberOfItems{

;

==?count:count+;

}

-(void)menuDataSource{

[self.tableDataSourceaddObject:[[MTSMenuModelalloc]
init:@"职位搜索"imagePath:@"jobsearch.png"imagePressPath:@"jobsearch_press.png"type:JobSearch]];

[self.tableDataSourceaddObject:[[MTSMenuModelalloc]
init:@"校园招聘"imagePath:@"campus.png"imagePressPath:@"campus_press.png"type:Campus]];

[self.tableDataSourceaddObject:[[MTSMenuModelalloc]
init:@"职场资讯"imagePath:@"worknews.png"imagePressPath:@"worknews_press.png"type:WorkNews]];

[self.tableDataSourceaddObject:[[MTSMenuModelalloc]
init:@"企业粉丝团"imagePath:@"fans.png"imagePressPath:@"fans_focus.png"type:Fans]];

[self.tableDataSourceaddObject:[[MTSMenuModelalloc]
init:@"My 51job"imagePath:@"my51job.png"imagePressPath:@"my51job_focus.png"type:My51Job]];

[self.tableDataSourceaddObject:[[MTSMenuModelalloc]
init:@"简历中心"imagePath:@"resumecenter.png"imagePressPath:@"resumecenter_focus.png"type:Resumecenter]];

[self.tableDataSource addObject:[[MTSMenuModel alloc] init:@"薪酬咨询"
imagePath:@"salaryquery.png" imagePressPath:@"salaryquery_focus.png" type:Salaryquery]];

[self.tableDataSource addObject:[[MTSMenuModel alloc] init:@"申请记录"
imagePath:@"jobapply.png" imagePressPath:@"jobapply_focus.png" type:JobApply]];

[self.tableDataSource addObject:[[MTSMenuModel alloc] init:@"很多其它"
imagePath:@"themore.png" imagePressPath:@"themore_focus.png" type:TheMore]];

}

@end


Ios 项目从头开发 MVVM模式(三)的更多相关文章

  1. 在iOS项目中引入MVVM

    本文翻译自:http://www.objc.io/issue-13/mvvm.html.为了方便读者并节约时间,有些不是和文章主题相关的就去掉了.如果读者要看原文的话可以通过前面的url直接访问.作者 ...

  2. IOS的MVC和MVVM模式简明介绍

    iOS中的MVC(Model-View-Controller)将软件系统分为Model.View.Controller三部分,结构图如下: Model: 你的应用本质上是什么(但不是它的展示方式) C ...

  3. IOS项目之分层MVVM

    在做.Net时,有用到三层架构,使项目分层.ios项目使用AFNetWork把网络层这块也放进了ViewController中,数据解析缓存这些也在里面,这样层次结构可能不够清楚,今天就试着分离了一下 ...

  4. IOS项目之弹出动画三

    前面写了弹出动画两个,今天做商城时又用到了,看着这个用着蛮普遍的,所以记了下来 // // mallMoreView.h // XQB // // Created by City--Online on ...

  5. Swift开发iOS项目实战视频教程(一)---iOS真简单

    本课主要介绍iOS项目的创建.第一个iOS项目的开发.UILabel.UIButton的使用. 假设你看完此视频还认为iOS非常难,请你来找我! 本教程摒弃枯燥的语法和知识解说,全是有趣有料的项目实战 ...

  6. iOS学习——iOS项目Project 和 Targets配置详解

    最近开始学习完整iOS项目的开发流程和思路,在实际的项目开发过程中,我们通常需要对项目代码和资料进行版本控制和管理,一般比较常用的SVN或者Github进行代码版本控制和项目管理.我们iOS项目的开发 ...

  7. MVVM模式应用体会

    转自:http://www.cnblogs.com/626498301/archive/2011/04/08/2009404.html 进公司实习工作后,本人接触的第一个技术名语就是MVVM模式,从学 ...

  8. IOS项目之弹出动画终结篇

    在之前写过IOS项目之弹出动画一.IOS项目之弹出动画二.IOS项目之弹出动画三,今天来一个终极封装已经上传到Github上弹出动画总结篇UIPopoverTableView. UIPopoverTa ...

  9. MVVM 模式下iOS项目目录结构详细说明

    ➠更多技术干货请戳:听云博客 我们在做项目的时候,会经常用到各种设计模式,最常见的要数 MVC (模型,视图,控制器)了.但是,今天我们要说的是另一种设计模式——MVVM. 所以 MVVM 到底是什么 ...

随机推荐

  1. svn基本使用详情

    1.增加(Add)先提到变更列表中,再commit到配置库中,选择新增文件,右键SVN菜单执行“Add“操作提交到”变更列表中”,然后右键SVN菜单执行”SVNCommit”提交到版本库中. 2.删除 ...

  2. Rust所有权语义模型

    编程语言的内存管理,大概可以分为自动和手动两种. 自动管理就是用 GC(垃圾回收)来自动管理内存,像 Java.Ruby.Golang.Elixir 等语言都依赖于 GC.而 C/C++ 却是依赖于手 ...

  3. go语言的碎片整理:time

    时间和日期是我们编程中经常用到的,本文主要介绍了Go语言内置的time包的基本用法. Go语言中导入包 单行导入 import "time" import "fmt&qu ...

  4. MySQL 初识

    一.MySQL介绍: MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,M ...

  5. 剑指Offer(书):用两个栈实现队列

    题目:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 分析:入栈时只入栈1,出栈为栈2:若栈2不为空,直接出栈:否则,将栈1中的值依次入栈2,之后栈2出栈 Sta ...

  6. 【HDU 3037】Saving Beans(卢卡斯模板)

    Problem Description Although winter is far away, squirrels have to work day and night to save beans. ...

  7. 如何取SQL结果集的第一条记录

    在SQL Server数据库中,使用top关键字: SELECT TOP number|percent column_name(s) FROM table_name 在MySQL数据库中,使用LIMI ...

  8. xtu summer individual 2 C - Hometask

    Hometask Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForces. Origin ...

  9. POJ2421 Constructing Roads

    Constructing Roads 这道题很水,就是一个裸的最小生成树,最不过把已经连接的节点的值再设为0. 代码: #include<cstdio> #include<cstri ...

  10. HDU4462稻草人

    l问题描述:有一块N*N的玉米田(N<=50),给定K个(X,Y)的坐标位置(K<=10)和相应的覆盖范围,请问,至少在这K个位置中选择几个放置稻草人,能保证玉米田全被覆盖?     #i ...