zoukankan      html  css  js  c++  java
  • Ios 项目从头开发 MVVM模式(三)

    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;

        [cell configureCell:self.onlineViewModel.tableDataSourceindex:indexPath.row+1];

       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{

       NSUInteger count = [self.tableDataSourcecount]/3;

       return [self.tableDataSourcecount]%3==0?count:count+1;

    }


    -(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




  • 相关阅读:
    仿EXT风格,仿EXT功能,Jquery页签插件,EM.Tabs 1.1,新增事件处理机制,可拓展
    插入数据的同时,返回ID值
    xml格式的string转换为dataset
    ASP.NET缓存:方法分析和实践示例
    showModalDialog()方法使用详解 (转)
    160809325贺彦
    vncdotool A command line VNC client
    使Windows服务以控制台方式调试
    DIV CSS阴影
    允许与桌面交互[.net Windows服务]
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/7184077.html
Copyright © 2011-2022 走看看