{"id":18512682,"url":"https://github.com/knightsj/sjstatictableview","last_synced_at":"2025-04-09T05:33:19.813Z","repository":{"id":62453828,"uuid":"85521199","full_name":"knightsj/SJStaticTableView","owner":"knightsj","description":"基于MVVM，用于快速搭建设置页，个人信息页表格等静态表格的框架","archived":false,"fork":false,"pushed_at":"2017-04-24T00:42:01.000Z","size":1964,"stargazers_count":112,"open_issues_count":3,"forks_count":24,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-03-24T00:06:40.258Z","etag":null,"topics":["ios","ios-demo","objective-c","uitableview"],"latest_commit_sha":null,"homepage":"","language":"Objective-C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/knightsj.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-03-20T01:04:10.000Z","updated_at":"2023-09-14T07:06:56.000Z","dependencies_parsed_at":"2022-11-02T00:01:16.984Z","dependency_job_id":null,"html_url":"https://github.com/knightsj/SJStaticTableView","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/knightsj%2FSJStaticTableView","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/knightsj%2FSJStaticTableView/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/knightsj%2FSJStaticTableView/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/knightsj%2FSJStaticTableView/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/knightsj","download_url":"https://codeload.github.com/knightsj/SJStaticTableView/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247987060,"owners_count":21028891,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ios","ios-demo","objective-c","uitableview"],"created_at":"2024-11-06T15:35:01.419Z","updated_at":"2025-04-09T05:33:14.800Z","avatar_url":"https://github.com/knightsj.png","language":"Objective-C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SJStaticTableView\n\n一个基于MVVM，用于快速搭建设置页，个人信息页的框架。\n封装了cell和section的viewModel，用另外一个类来充当``UITableViewDataSource``的角色。\n\n**使用方法**：只需继承``SJStaticTableViewController``并给数据源传入viewModel数组即可。\n\n支持的cell类型：\n\n```objc\ntypedef NS_ENUM(NSInteger, SSJStaticCellType) {\n    \n    //系统风格的各种cell类型，已封装好，可以直接用\n    SSJStaticCellTypeSystemLogout,                          //退出登录cell（已封装好）\n    SSJStaticCellTypeSystemAccessoryNone,                   //右侧没有任何控件\n    SSJStaticCellTypeSystemAccessorySwitch,                 //右侧是开关\n    SSJStaticCellTypeSystemAccessoryDisclosureIndicator,    //右侧是三角箭头(箭头左侧可以有一个image或者一个label，或者二者都有，根据传入的参数决定)\n    \n    //需要用户自己添加的自定义cell类型\n    SSJStaticCellTypeMeAvatar,                              //个人页“我”cell  \n};\n```\n\n![支持cell类型](http://oih3a9o4n.bkt.clouddn.com/sjstatictableview_6.png)\n\n## 集成方法：\n1. 静态：手动将SJStaticTableViewComponent文件夹拖入到工程中。\n2. 动态：CocoaPods：``pod 'SJStaticTableView', '~\u003e 1.2.0``。\n\n## 1. Demo效果图：\n![发现页 | 个人页 | 个人信息页 | 设置页](http://oih3a9o4n.bkt.clouddn.com/sjstatictableview_1.png)\n\n## 2. 页面与代码展示\n\n### 2.1 发现页\n#### 效果图：\n![发现页](http://oih3a9o4n.bkt.clouddn.com/sjstatictableview_4.png)\n\n#### 数据源设置代码：\n```objc\n+ (NSArray *)momentsPageData\n{\n    // ========== section 0\n    SJStaticTableviewCellViewModel *vm0 = [[SJStaticTableviewCellViewModel alloc] init];\n    vm0.leftImage = [UIImage imageNamed:@\"ff_IconShowAlbum\"];\n    vm0.leftTitle = @\"朋友圈\";\n    vm0.indicatorLeftImage = [UIImage imageNamed:@\"avatar\"];\n    vm0.identifier = 0;\n    \n    SJStaticTableviewSectionViewModel *section0 = [[SJStaticTableviewSectionViewModel alloc] initWithCellViewModelsArray: @[vm0]];\n    \n    \n    // ========== section 1\n    SJStaticTableviewCellViewModel *vm1 = [[SJStaticTableviewCellViewModel alloc] init];\n    vm1.leftImage = [UIImage imageNamed:@\"ff_IconQRCode\"];\n    vm1.leftTitle = @\"扫一扫\";\n    vm1.identifier = 1;\n    \n    SJStaticTableviewCellViewModel *vm2 = [[SJStaticTableviewCellViewModel alloc] init];\n    vm2.leftImage = [UIImage imageNamed:@\"ff_IconShake\"];\n    vm2.leftTitle = @\"摇一摇\";\n    vm2.identifier = 2;\n    \n    \n    SJStaticTableviewSectionViewModel *section1 = [[SJStaticTableviewSectionViewModel alloc] initWithCellViewModelsArray:@[vm1,vm2]];\n    \n    \n    SJStaticTableviewCellViewModel *vm3 = [[SJStaticTableviewCellViewModel alloc] init];\n    vm3.leftImage = [UIImage imageNamed:@\"ff_IconLocationService\"];\n    vm3.leftTitle = @\"附近的人\";\n    vm3.identifier = 3;\n    \n    \n    SJStaticTableviewCellViewModel *vm4 = [[SJStaticTableviewCellViewModel alloc] init];\n    vm4.leftImage = [UIImage imageNamed:@\"ff_IconBottle\"];\n    vm4.leftTitle = @\"漂流瓶\";\n    vm4.identifier = 4;\n    \n    \n    SJStaticTableviewSectionViewModel *section2 = [[SJStaticTableviewSectionViewModel alloc] initWithCellViewModelsArray:@[vm3,vm4]];\n    \n    \n    // ========== section 2\n    SJStaticTableviewCellViewModel *vm5 = [[SJStaticTableviewCellViewModel alloc] init];\n    vm5.leftImage = [UIImage imageNamed:@\"CreditCard_ShoppingBag\"];\n    vm5.leftTitle = @\"购物\";\n    vm5.identifier = 5;\n\n    \n    // ========== section 3\n    SJStaticTableviewCellViewModel *vm6 = [[SJStaticTableviewCellViewModel alloc] init];\n    vm6.leftImage = [UIImage imageNamed:@\"MoreGame\"];\n    vm6.leftTitle = @\"游戏\";\n    vm6.indicatorLeftImage = [UIImage imageNamed:@\"wzry\"];\n    vm6.indicatorLeftTitle = @\"一起来玩王者荣耀呀!\";\n    vm6.identifier = 7;\n    \n    \n    SJStaticTableviewSectionViewModel *section3 = [[SJStaticTableviewSectionViewModel alloc] initWithCellViewModelsArray:@[vm5,vm6]];\n    \n    return @[section0,section1,section2,section3];\n}\n```\n#### 发现页ViewController：\n```objc\n- (void)viewDidLoad {\n    \n    [super viewDidLoad];\n    self.navigationItem.title = @\"发现\";\n}\n\n\n- (void)createDataSource\n{\n    self.dataSource = [[SJStaticTableViewDataSource alloc] initWithViewModelsArray:[Factory momentsPageData] configureBlock:^(SJStaticTableViewCell *cell, SJStaticTableviewCellViewModel *viewModel) {\n        \n        switch (viewModel.staticCellType)\n        {\n            case SSJStaticCellTypeSystemAccessoryDisclosureIndicator:\n            {\n                [cell configureAccessoryDisclosureIndicatorCellWithViewModel:viewModel];\n            }\n                break;\n                \n            default:\n                break;\n        }\n    }];\n}\n```\n### 2.2 设置页\n\n#### 效果图：\n![设置页](http://oih3a9o4n.bkt.clouddn.com/sjstatictableview_3.png)\n\n#### 数据源设置代码：\n```objc\n+ (NSArray *)settingPageData\n{\n    // ========== section 0\n    SJStaticTableviewCellViewModel *vm0 = [[SJStaticTableviewCellViewModel alloc] init];\n    vm0.leftTitle = @\"账号与安全\";\n    vm0.identifier = 0;\n    vm0.indicatorLeftTitle = @\"已保护\";\n    vm0.indicatorLeftImage = [UIImage imageNamed:@\"ProfileLockOn\"];\n    vm0.isImageFirst = NO;\n    \n    SJStaticTableviewSectionViewModel *section0 = [[SJStaticTableviewSectionViewModel alloc] initWithCellViewModelsArray:@[vm0]];\n    \n    \n    // ========== section 1\n    SJStaticTableviewCellViewModel *vm1 = [[SJStaticTableviewCellViewModel alloc] init];\n    vm1.leftTitle = @\"新消息通知\";\n    vm1.identifier = 1;\n    \n    //额外添加switch\n    SJStaticTableviewCellViewModel *vm7 = [[SJStaticTableviewCellViewModel alloc] init];\n    vm7.leftTitle = @\"夜间模式\";\n    vm7.switchValueDidChangeBlock = ^(BOOL isON){\n        NSString *message = isON?@\"打开夜间模式\":@\"关闭夜间模式\";\n        NSLog(@\"%@\",message);\n    };\n    vm7.staticCellType = SSJStaticCellTypeSystemAccessorySwitch;\n    vm7.identifier = 7;\n    \n    SJStaticTableviewCellViewModel *vm8 = [[SJStaticTableviewCellViewModel alloc] init];\n    vm8.leftTitle = @\"清理缓存\";\n    vm8.indicatorLeftTitle = @\"12.3M\";\n    vm8.identifier = 8;\n    \n    SJStaticTableviewCellViewModel *vm2 = [[SJStaticTableviewCellViewModel alloc] init];\n    vm2.leftTitle = @\"隐私\";\n    vm2.identifier = 2;\n    \n    \n    SJStaticTableviewCellViewModel *vm3 = [[SJStaticTableviewCellViewModel alloc] init];\n    vm3.leftTitle = @\"通用\";\n    vm3.identifier = 3;\n    \n    \n    SJStaticTableviewSectionViewModel *section1 = [[SJStaticTableviewSectionViewModel alloc] initWithCellViewModelsArray:@[vm1,vm7,vm8,vm2,vm3]];\n    \n    // ========== section 2\n    SJStaticTableviewCellViewModel *vm4 = [[SJStaticTableviewCellViewModel alloc] init];\n    vm4.leftTitle = @\"帮助与反馈\";\n    vm4.identifier = 4;\n    \n    SJStaticTableviewCellViewModel *vm5 = [[SJStaticTableviewCellViewModel alloc] init];\n    vm5.leftTitle = @\"关于微信\";\n    vm5.identifier = 5;\n    \n    SJStaticTableviewSectionViewModel *section2 = [[SJStaticTableviewSectionViewModel alloc] initWithCellViewModelsArray:@[vm4,vm5]];\n    \n    SJStaticTableviewCellViewModel *vm9 = [[SJStaticTableviewCellViewModel alloc] init];\n    vm9.leftTitle = @\"定制性cell展示页面 - 分组\";\n    vm9.identifier = 9;\n    \n    SJStaticTableviewCellViewModel *vm10 = [[SJStaticTableviewCellViewModel alloc] init];\n    vm10.leftTitle = @\"定制性cell展示页面 - 同组\";\n    vm10.identifier = 10;\n    \n    SJStaticTableviewSectionViewModel *section4 = [[SJStaticTableviewSectionViewModel alloc] initWithCellViewModelsArray:@[vm9,vm10]];\n    \n    \n    // ========== section 3\n    SJStaticTableviewCellViewModel *vm6 = [[SJStaticTableviewCellViewModel alloc] init];\n    vm6.staticCellType = SSJStaticCellTypeSystemLogout;\n    vm6.cellID = @\"logout\";\n    vm6.identifier = 6;\n    \n    \n    SJStaticTableviewSectionViewModel *section3 = [[SJStaticTableviewSectionViewModel alloc] initWithCellViewModelsArray:@[vm6]];\n    \n    return @[section0,section1,section2,section4,section3];\n}\n```\n\n#### 设置页ViewController：\n```objc\n- (void)viewDidLoad {\n    [super viewDidLoad];\n    self.navigationItem.title = @\"设置\";\n}\n\n\n- (void)createDataSource\n{\n    self.dataSource = [[SJStaticTableViewDataSource alloc] initWithViewModelsArray:[Factory settingPageData] configureBlock:^(SJStaticTableViewCell *cell, SJStaticTableviewCellViewModel *viewModel) {\n        \n        switch (viewModel.staticCellType)\n        {\n            case SSJStaticCellTypeSystemAccessoryDisclosureIndicator:\n            {\n                [cell configureAccessoryDisclosureIndicatorCellWithViewModel:viewModel];\n            }\n                break;\n                \n            case SSJStaticCellTypeSystemAccessorySwitch:\n            {\n                [cell configureAccessorySwitchCellWithViewModel:viewModel];\n            }\n                break;\n                \n            case SSJStaticCellTypeSystemLogout:\n            {\n                [cell configureLogoutTableViewCellWithViewModel:viewModel];\n            }\n                break;\n                \n            case SSJStaticCellTypeSystemAccessoryNone:\n            {\n                [cell configureAccessoryNoneCellWithViewModel:viewModel];\n            }\n                break;\n                \n            default:\n                break;\n        }\n    }];\n}\n\n\n- (void)didSelectViewModel:(SJStaticTableviewCellViewModel *)viewModel atIndexPath:(NSIndexPath *)indexPath\n{\n    \n    switch (viewModel.identifier)\n    {\n            \n        case 6:\n        {\n            NSLog(@\"退出登录\");\n            [self showAlertWithMessage:@\"真的要退出登录嘛？\"];\n        }\n            break;\n            \n        case 8:\n        {\n            NSLog(@\"清理缓存\");\n        }\n            break;\n            \n        case 9:\n        {\n            NSLog(@\"跳转到定制性cell展示页面 - 分组\");\n            SJCustomCellsViewController *vc = [[SJCustomCellsViewController alloc] init];\n            [self.navigationController pushViewController:vc animated:YES];\n        }\n            break;\n            \n        case 10:\n        {\n            NSLog(@\"跳转到定制性cell展示页面 - 同组\");\n            SJCustomCellsOneSectionViewController *vc = [[SJCustomCellsOneSectionViewController alloc] init];\n            [self.navigationController pushViewController:vc animated:YES];\n        }\n            break;\n            \n        default:\n            break;\n    }\n}\n```\n\n## 3. 定制性展示\n![分组定制 | 同组定制](http://oih3a9o4n.bkt.clouddn.com/sjstatictableview_2.png)\n\n\n分组页面：\n```objc\n+ (NSArray *)customCellsPageData\n{\n    //默认配置\n    SJStaticTableviewCellViewModel *vm1 = [[SJStaticTableviewCellViewModel alloc] init];\n    vm1.leftImage = [UIImage imageNamed:@\"MoreGame\"];\n    vm1.leftTitle = @\"全部默认配置，用于对照\";\n    vm1.indicatorLeftImage = [UIImage imageNamed:@\"wzry\"];\n    vm1.indicatorLeftTitle = @\"王者荣耀!\";\n    \n    SJStaticTableviewSectionViewModel *section1 = [[SJStaticTableviewSectionViewModel alloc] initWithCellViewModelsArray:@[vm1]];\n    \n    SJStaticTableviewCellViewModel *vm2 = [[SJStaticTableviewCellViewModel alloc] init];\n    vm2.leftImage = [UIImage imageNamed:@\"MoreGame\"];\n    vm2.leftTitle = @\"左侧图片变小\";\n    vm2.indicatorLeftImage = [UIImage imageNamed:@\"wzry\"];\n    vm2.indicatorLeftTitle = @\"王者荣耀!\";\n    \n    SJStaticTableviewSectionViewModel *section2 = [[SJStaticTableviewSectionViewModel alloc] initWithCellViewModelsArray:@[vm2]];\n    section2.leftImageSize = CGSizeMake(20, 20);\n    \n    SJStaticTableviewCellViewModel *vm3 = [[SJStaticTableviewCellViewModel alloc] init];\n    vm3.leftImage = [UIImage imageNamed:@\"MoreGame\"];\n    vm3.leftTitle = @\"字体变小变红\";\n    vm3.indicatorLeftImage = [UIImage imageNamed:@\"wzry\"];\n    vm3.indicatorLeftTitle = @\"王者荣耀!\";\n    \n    SJStaticTableviewSectionViewModel *section3 = [[SJStaticTableviewSectionViewModel alloc] initWithCellViewModelsArray:@[vm3]];\n    section3.leftLabelTextFont = [UIFont systemFontOfSize:8];\n    section3.leftLabelTextColor = [UIColor redColor];\n    \n    \n    SJStaticTableviewCellViewModel *vm4 = [[SJStaticTableviewCellViewModel alloc] init];\n    vm4.leftImage = [UIImage imageNamed:@\"MoreGame\"];\n    vm4.leftTitle = @\"左侧两个控件距离变大\";\n    vm4.indicatorLeftImage = [UIImage imageNamed:@\"wzry\"];\n    vm4.indicatorLeftTitle = @\"王者荣耀!\";\n    \n    SJStaticTableviewSectionViewModel *section4 = [[SJStaticTableviewSectionViewModel alloc] initWithCellViewModelsArray:@[vm4]];\n    section4.leftImageAndLabelGap = 20;\n    \n    \n    SJStaticTableviewCellViewModel *vm5 = [[SJStaticTableviewCellViewModel alloc] init];\n    vm5.leftImage = [UIImage imageNamed:@\"MoreGame\"];\n    vm5.leftTitle = @\"右侧图片变小\";\n    vm5.indicatorLeftImage = [UIImage imageNamed:@\"wzry\"];\n    vm5.indicatorLeftTitle = @\"王者荣耀!\";\n    \n    SJStaticTableviewSectionViewModel *section5 = [[SJStaticTableviewSectionViewModel alloc] initWithCellViewModelsArray:@[vm5]];\n    section5.indicatorLeftImageSize = CGSizeMake(15, 15);\n    \n    \n    SJStaticTableviewCellViewModel *vm6= [[SJStaticTableviewCellViewModel alloc] init];\n    vm6.leftImage = [UIImage imageNamed:@\"MoreGame\"];\n    vm6.leftTitle = @\"右侧字体变大变蓝\";\n    vm6.indicatorLeftImage = [UIImage imageNamed:@\"wzry\"];\n    vm6.indicatorLeftTitle = @\"王者荣耀!\";\n    \n    SJStaticTableviewSectionViewModel *section6 = [[SJStaticTableviewSectionViewModel alloc] initWithCellViewModelsArray:@[vm6]];\n    section6.indicatorLeftLabelTextFont = [UIFont systemFontOfSize:18];\n    section6.indicatorLeftLabelTextColor = [UIColor blueColor];\n    \n    \n    SJStaticTableviewCellViewModel *vm7= [[SJStaticTableviewCellViewModel alloc] init];\n    vm7.leftImage = [UIImage imageNamed:@\"MoreGame\"];\n    vm7.leftTitle = @\"右侧两个控件距离变大\";\n    vm7.indicatorLeftImage = [UIImage imageNamed:@\"wzry\"];\n    vm7.indicatorLeftTitle = @\"王者荣耀!\";\n    \n    SJStaticTableviewSectionViewModel *section7 = [[SJStaticTableviewSectionViewModel alloc] initWithCellViewModelsArray:@[vm7]];\n    section7.indicatorLeftImageAndLabelGap = 18;\n    \n    \n    return @[section1,section2,section3,section4,section5,section6,section7];\n    \n}\n```\n\u003e我们可以看到，定制的代码都作用于section的viewModel。\n\n同组页面：\n\n```objc\n+ (NSArray *)customCellsOneSectionPageData\n{\n    //默认配置\n    SJStaticTableviewCellViewModel *vm1 = [[SJStaticTableviewCellViewModel alloc] init];\n    vm1.leftImage = [UIImage imageNamed:@\"MoreGame\"];\n    vm1.leftTitle = @\"全部默认配置，用于对照\";\n    vm1.indicatorLeftImage = [UIImage imageNamed:@\"wzry\"];\n    vm1.indicatorLeftTitle = @\"王者荣耀!\";\n    \n    \n    SJStaticTableviewCellViewModel *vm2 = [[SJStaticTableviewCellViewModel alloc] init];\n    vm2.leftImage = [UIImage imageNamed:@\"MoreGame\"];\n    vm2.leftTitle = @\"左侧图片变小\";\n    vm2.indicatorLeftImage = [UIImage imageNamed:@\"wzry\"];\n    vm2.indicatorLeftTitle = @\"王者荣耀!\";\n    vm2.leftImageSize = CGSizeMake(20, 20);\n    \n    \n    SJStaticTableviewCellViewModel *vm3 = [[SJStaticTableviewCellViewModel alloc] init];\n    vm3.leftImage = [UIImage imageNamed:@\"MoreGame\"];\n    vm3.leftTitle = @\"字体变小变红\";\n    vm3.indicatorLeftImage = [UIImage imageNamed:@\"wzry\"];\n    vm3.indicatorLeftTitle = @\"王者荣耀!\";\n    vm3.leftLabelTextFont = [UIFont systemFontOfSize:8];\n    vm3.leftLabelTextColor = [UIColor redColor];\n    \n    \n    SJStaticTableviewCellViewModel *vm4 = [[SJStaticTableviewCellViewModel alloc] init];\n    vm4.leftImage = [UIImage imageNamed:@\"MoreGame\"];\n    vm4.leftTitle = @\"左侧两个控件距离变大\";\n    vm4.indicatorLeftImage = [UIImage imageNamed:@\"wzry\"];\n    vm4.indicatorLeftTitle = @\"王者荣耀!\";\n    vm4.leftImageAndLabelGap = 20;\n    \n    \n    SJStaticTableviewCellViewModel *vm5 = [[SJStaticTableviewCellViewModel alloc] init];\n    vm5.leftImage = [UIImage imageNamed:@\"MoreGame\"];\n    vm5.leftTitle = @\"右侧图片变小\";\n    vm5.indicatorLeftImage = [UIImage imageNamed:@\"wzry\"];\n    vm5.indicatorLeftTitle = @\"王者荣耀!\";\n    vm5.indicatorLeftImageSize = CGSizeMake(15, 15);\n    \n    \n    SJStaticTableviewCellViewModel *vm6= [[SJStaticTableviewCellViewModel alloc] init];\n    vm6.leftImage = [UIImage imageNamed:@\"MoreGame\"];\n    vm6.leftTitle = @\"右侧字体变大变蓝\";\n    vm6.indicatorLeftImage = [UIImage imageNamed:@\"wzry\"];\n    vm6.indicatorLeftTitle = @\"王者荣耀!\";\n    vm6.indicatorLeftLabelTextFont = [UIFont systemFontOfSize:18];\n    vm6.indicatorLeftLabelTextColor = [UIColor blueColor];\n    \n    \n    SJStaticTableviewCellViewModel *vm7= [[SJStaticTableviewCellViewModel alloc] init];\n    vm7.leftImage = [UIImage imageNamed:@\"MoreGame\"];\n    vm7.leftTitle = @\"右侧两个控件距离变大\";\n    vm7.indicatorLeftImage = [UIImage imageNamed:@\"wzry\"];\n    vm7.indicatorLeftTitle = @\"王者荣耀!\";\n    vm7.indicatorLeftImageAndLabelGap = 18;\n    \n    SJStaticTableviewSectionViewModel *section1 = [[SJStaticTableviewSectionViewModel alloc] initWithCellViewModelsArray:@[vm1,vm2,vm3,vm4,vm5,vm6,vm7]];\n    \n    return @[section1];\n}\n```\n\u003e为了方便比较，同组页面的定制和分组是一致的。我们可以看到，定制代码都作用于cell的viewModel上了。\n\n\n## 4. 刷新数据源\n----\n支持更新数据源后，刷新数据源。比如在发现页模拟网络请求，在请求结束后更新某个cell的viewmodel：\n\n```objc\n//模拟网络请求\n    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{\n        \n        //请求成功x\n        NSDictionary *responseDict = @{@\"title_info\":@\"新游戏上架啦\",\n                                       @\"title_icon\":@\"game_1\",\n                                       @\"game_info\":@\"一起来玩斗地主呀！\",\n                                       @\"game_icon\":@\"doudizhu\"\n                                       };\n        //将要刷新cell的indexPath\n        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:1 inSection:3];\n        \n        //获取cell对应的viewModel\n        SJStaticTableviewCellViewModel *viewModel = [self.dataSource tableView:self.tableView cellViewModelAtIndexPath:indexPath];\n        \n        if (viewModel) {\n            //更新viewModel\n            viewModel.leftTitle = responseDict[@\"title_info\"];\n            viewModel.leftImage = [UIImage imageNamed:responseDict[@\"title_icon\"]];\n            viewModel.indicatorLeftImage = [UIImage imageNamed:responseDict[@\"game_icon\"]];\n            viewModel.indicatorLeftTitle = responseDict[@\"game_info\"];\n            \n            //刷新tableview\n           [self.tableView reloadData];\n        }\n    });\n```\n\n效果图：\n\n![](http://oih3a9o4n.bkt.clouddn.com/sjstatictableview_8.png)\n\n## 5. 没有默认数据源的情况\n\nSJStaticViewController在创建的时候分为两种情况:\n\n```objc\n//SJStaticTableViewController.h\ntypedef enum : NSUInteger {\n    \n    SJDefaultDataTypeExist,    //在表格生成之前就有数据（1. 完全不依赖网络请求，有现成的完整数据 2. 先生成默认数据，然后通过网络请求来更新数据并刷新表格）\n    SJDefaultDataTypeNone,     //无法生成默认数据，需要完全依赖网络请求，在拿到数据后，生成表格\n    \n}SJDefaultDataType;\n\n- (instancetype)initWithDefaultDataType:(SJDefaultDataType)defualtDataType;\n```\n\n```objc\n//SJStaticTableViewController.m\n- (instancetype)initWithDefaultDataType:(SJDefaultDataType)defualtDataType\n{\n    self = [super init];\n    if (self) {\n        self.defualtDataType = defualtDataType;\n    }\n    return self;\n}\n\n- (instancetype)init\n{\n    self = [self initWithDefaultDataType:SJDefaultDataTypeExist];//默认是SJDefaultDataTypeExist\n    return self;\n}\n```\n\n详细说明一下这两种情况：\n1. SJDefaultDataTypeExist：在表格生成之前就存在数据，可以是表格的全部数据，也可以是表格的默认数据（后来通过网络请求来更新部分数据，参考上一节）。\n2. SJDefaultDataTypeNone：意味着当前没有任何的默认数据可以使用，也就是无法生成tableview，需要在网络请求拿到数据后，再手动调用生成数据源，生成表格的方法。\n```objc\n- (void)viewDidLoad {\n    \n    [super viewDidLoad];\n    [self configureNav];\n    \n    //在能够提供给tableivew全部，或者部分数据源的情况下，可以先构造出tableview；\n    //否则，需要在网络请求结束后，手动调用configureTableView方法\n    if (self.defualtDataType == SJDefaultDataTypeExist) {\n        [self configureTableView];\n    }\n}\n\n//只有在SJDefaultDataTypeExist的时候才会自动调用，否则需要手动调用\n- (void)configureTableView\n{\n    [self createDataSource];//生成数据源\n    [self createTableView];//生成表格\n}\n```\n看一个例子，我们将表情页设置为``SJDefaultDataTypeNone``，那么就意味着我们需要手动调用``configureTableView``方法：\n\n```objc\n- (void)viewDidLoad {\n    \n    [super viewDidLoad];\n    \n     self.navigationItem.title = @\"表情\";\n    [self networkRequest];\n}\n\n\n- (void)networkRequest\n{\n    [MBProgressHUD showHUDAddedTo: self.view animated:YES];\n    \n    //模拟网络请求\n    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{\n        \n        [MBProgressHUD hideHUDForView: self.view animated:YES];\n         self.modelsArray = [Factory emoticonPage];//网络请求后，将数据保存在self.modelsArray里面\n        [self configureTableView];//手动调用\n        \n    });\n}\n\n- (void)createDataSource\n{\n    self.dataSource = [[SJStaticTableViewDataSource alloc] initWithViewModelsArray:self.modelsArray configureBlock:^(SJStaticTableViewCell *cell, SJStaticTableviewCellViewModel *viewModel) {\n        \n        switch (viewModel.staticCellType) {\n                \n            case SJStaticCellTypeSystemAccessoryDisclosureIndicator:\n            {\n                [cell configureAccessoryDisclosureIndicatorCellWithViewModel:viewModel];\n            }\n                break;\n                \n            default:\n                break;\n        }\n    }];\n}\n```\n\n看一下效果图：\n![](http://oih3a9o4n.bkt.clouddn.com/sjstatictableview_9.png)\n\n## License\n\nSJStaticTableView is released under the MIT license. \n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fknightsj%2Fsjstatictableview","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fknightsj%2Fsjstatictableview","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fknightsj%2Fsjstatictableview/lists"}