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




  • 相关阅读:
    LeetCode 769. Max Chunks To Make Sorted
    LeetCode 845. Longest Mountain in Array
    LeetCode 1059. All Paths from Source Lead to Destination
    1129. Shortest Path with Alternating Colors
    LeetCode 785. Is Graph Bipartite?
    LeetCode 802. Find Eventual Safe States
    LeetCode 1043. Partition Array for Maximum Sum
    LeetCode 841. Keys and Rooms
    LeetCode 1061. Lexicographically Smallest Equivalent String
    LeetCode 1102. Path With Maximum Minimum Value
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/7184077.html
Copyright © 2011-2022 走看看