viewcontroller瘦身之一(转载)

在一个IOS项目中,viewcontroller通常是最大的文件,并且包含了许多不必要的代码,重用率是最低的。

我们可以尝试给viewcontroller瘦身,让他看起来不是那么的臃肿。

今天说到的是,UITableViewDataSource。

UITableview可能是平时写项目中用到的最多的组件了,使用它要实现它的代理协议和数据源方法,每次都是那么些东西方法controller中,看起来不舒服,我们可以给他瘦身一下。比如这样做。

因为datasource基本上是围绕数组去做一些事,更针对的说就是围绕viewcontroller的数据数组作一些事情,我们可以把它抽出来,单独的放在一个类中,我们使用一个block来设置cell,也可以使用delegate来做这件事,这完全取决于你。

下面上代码,举个栗子~

 1 //
 2 //  ArrayDataSource.h
 3 //  LrdBasicFramework
 4 //
 5 //  Created by 键盘上的舞者 on 5/21/16.
 6 //  Copyright © 2016 键盘上的舞者. All rights reserved.
 7 //  封装的一个dataSource类,可以使controller更加的轻量级
 8
 9 #import <Foundation/Foundation.h>
10
11 typedef void(^TableViewCellConfigureBlock)(id cell, id item);
12
13 @interface ArrayDataSource : NSObject <UITableViewDataSource>
14
15 - (id)initWithItems:(NSArray *)items
16      cellIdentifier:(NSString *)identifier
17      configureBlock:(TableViewCellConfigureBlock)configureBlock;
18
19 - (id)itemAtIndexPath:(NSIndexPath *)indexPath;
20
21 @end
 1 //
 2 //  ArrayDataSource.m
 3 //  LrdBasicFramework
 4 //
 5 //  Created by 键盘上的舞者 on 5/21/16.
 6 //  Copyright © 2016 键盘上的舞者. All rights reserved.
 7 //
 8
 9 #import "ArrayDataSource.h"
10
11 @interface ArrayDataSource ()
12
13 @property (nonatomic, strong) NSArray *items;
14 @property (nonatomic, copy) NSString *identifier;
15 @property (nonatomic, copy) TableViewCellConfigureBlock configureBlock;
16
17 @end
18
19 @implementation ArrayDataSource
20
21 - (instancetype)init {
22     return nil;
23 }
24
25 - (id)initWithItems:(NSArray *)items cellIdentifier:(NSString *)identifier configureBlock:(TableViewCellConfigureBlock)configureBlock {
26     self = [super init];
27     if (self) {
28         self.items = items;
29         self.identifier = identifier;
30         self.configureBlock = configureBlock;
31     }
32     return self;
33 }
34
35 - (id)itemAtIndexPath:(NSIndexPath *)indexPath {
36     return self.items[(NSUInteger) indexPath.row];
37 }
38
39 #pragma mark - DataSource
40 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
41     return self.items.count;
42 }
43
44 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
45     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:self.identifier forIndexPath:indexPath];
46     id item = [self itemAtIndexPath:indexPath];
47     self.configureBlock(cell, item);
48     return cell;
49 }
50 @end

然后我们可以在viewcontroller中来这样使用它

 1 //
 2 //  DemoRootController.m
 3 //  LrdBasicFramework
 4 //
 5 //  Created by 键盘上的舞者 on 5/21/16.
 6 //  Copyright © 2016 键盘上的舞者. All rights reserved.
 7 //
 8
 9 #import "DemoRootController.h"
10 #import "ArrayDataSource.h"
11 #import "DemoFrameController.h"
12 #import "DemoFouctionController.h"
13 #import "DemoDIYController.h"
14 #import "DemoCommUtils.h"
15
16 static NSString *identifier = @"menu_cell";
17
18 @interface DemoRootController ()
19
20 @property (nonatomic, strong) ArrayDataSource *arrayDataSource;
21
22 @end
23
24 @implementation DemoRootController
25
26 - (void)viewDidLoad {
27     [super viewDidLoad];
28     self.title = @"Demo";
29     //初始化
30     [self initUI];
31 }
32
33 - (void)initUI {
34     NSArray *items = @[@"自定义控件", @"功能性拓展", @"常用工具类", @"基层框架"];
35     self.arrayDataSource = [[ArrayDataSource alloc] initWithItems:items cellIdentifier:identifier configureBlock:^(UITableViewCell *cell, NSString *item) {
36         cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
37         cell.textLabel.text = item;
38     }];
39     self.tableView.dataSource = self.arrayDataSource;
40     [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:identifier];
41 }
42
43 #pragma mark - delegate
44 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
45     if (indexPath.row == 0) {
46         //自定义控件
47         DemoDIYController *vc = [[DemoDIYController alloc] initWithStyle:UITableViewStyleGrouped];
48         vc.title = [self.arrayDataSource itemAtIndexPath:indexPath];
49         [self.navigationController pushViewController:vc animated:YES];
50     }else if (indexPath.row == 1) {
51         //功能性拓展
52         DemoFouctionController *vc = [[DemoFouctionController alloc] initWithStyle:UITableViewStyleGrouped];
53         vc.title = [self.arrayDataSource itemAtIndexPath:indexPath];
54         [self.navigationController pushViewController:vc animated:YES];
55     }else if (indexPath.row == 2) {
56         //常用工具类
57         DemoCommUtils *vc = [[DemoCommUtils alloc] initWithStyle:UITableViewStyleGrouped];
58         vc.title = [self.arrayDataSource itemAtIndexPath:indexPath];
59         [self.navigationController pushViewController:vc animated:YES];
60     }else if (indexPath.row == 3) {
61         //基层框架
62         DemoFrameController *vc = [[DemoFrameController alloc] initWithStyle:UITableViewStyleGrouped];
63         vc.title = [self.arrayDataSource itemAtIndexPath:indexPath];
64         [self.navigationController pushViewController:vc animated:YES];
65     }
66     [tableView deselectRowAtIndexPath:indexPath animated:YES];
67 }
68
69 @end

是不是看起来viewcontroller瘦了许多??

转自:http://www.lrdup.net/archives/1046

时间: 2024-10-09 06:49:16

viewcontroller瘦身之一(转载)的相关文章

iOS:使用MVC模式帮ViewController瘦身

如何给UIViewController瘦身 随着程序逻辑复杂度的提高,你是否也发现了App中一些ViewController的代码行数急剧增多,达到了2,3千行,甚至更多.这时如果想再添加一点功能或者修改现有逻辑变得让人无比头疼.如果你遇到了这类问题,那是时候停下来了,思考一下如何更好地组织代码,给VC瘦身.本文将会阐述如何结合MVC的思想帮你的VC瘦身同时提高复用和可扩展性. 一.开发中常见的现象和缺点 iOS中最常见的一种设计模式就是MVC,但在实际开发过程中,我们因为这样.那样的原因让单纯

iOS开发&gt;学无止境 - 使用MVC模式帮ViewController瘦身

随着程序逻辑复杂度的提高,你是否也发现了App中一些ViewController的代码行数急剧增多,达到了2,3千行,甚至更多.这时如果想再添加一点功能或者修改现有逻辑变得让人无比头疼.如果你遇到了这类问题,那是时候停下来了,思考一下如何更好地组织代码,给VC瘦身.本文将会阐述如何结合MVC的思想帮你的VC瘦身同时提高复用和可扩展性. 一.开发中常见的现象和缺点 iOS中最常见的一种设计模式就是MVC,但在实际开发过程中,我们因为这样.那样的原因让单纯的ViewController变成了集Mod

39、apk瘦身(转载)

本文转自::Android开发中文站 » 关于APK瘦身值得分享的一些经验 从APK的文件结构说起 APK在安装和更新之前都需要经过网络将其下载到手机,如果APK越大消耗的流量就会越多,特别是对于使用移动网络的用户来讲,消耗流量越多就代表需要花更多的钱去购买流量.同时一些第三方应用商城也会对上传的APK大小有限制,所以为了能够让产品能够更受商城和用户欢迎,APK瘦身是第一步,更小的APK标示着更多地用户愿意去下载和体验. 为了能够减小APK的大小,首先需要知道APK由哪些部分构成,然后针对每个部

viewController 瘦身 -- 通过新建DataSource类来管理tableView的数据源方法

大致思路: 新建一个DataSource类,把tableView 的数据源代理交给这个类. 核心代码: ViewController中: - (void)setupTableView { // 创建回调,用于在数据源方法中,对cell进行处理 TableViewCellConfigureBlock configureBlock = ^(TestCell *cell, model *item) { [cell configureWithModel:item]; }; // 创建dataSource

控制器瘦身及tableView相关

今天简单介绍下为ViewController瘦身的一些想法,不足之处还请指出. 一.关于MVVM设计模式 网上的介绍很多,简单说下我的理解. 个人理解: MVVM = 控制器 + 视图 + 数据模型 + 视图模型 其中 视图模型View - Model 是将 控制控制器中的 网络请求 下拉刷新 下拉加载 及用户交互操作 剥离出来 放到一个工具类里面 由此达到解耦合为控制器瘦身的目的. 二.关于小型工厂模式的使用         开发过程中UITableView的使用频率很高,可你是怎样创建tab

iOS 瘦身ViewController 分离tableViewDataSource

1: #import <Foundation/Foundation.h> typedef void(^configureCellBlock)(id cell, id item);//瘦身viewcontroller @interface RRFriendTableViewDataSource : NSObject<UITableViewDataSource> - (id)initWithItems:(NSArray *)items cellItentifier:(NSString

如何给UIViewController瘦身

本文转载至  http://www.cocoachina.com/ios/20141128/10356.html 随着程序逻辑复杂度的提高,你是否也发现了App中一些ViewController的代码行数急剧增多,达到了2.3千行,甚至更多.这时如果想再添加一点功能或者修改现有逻辑变得让人无比头疼.如果你遇到了这类问题,那是时候停下来了,思考一下如何更好地组织代码,给VC瘦身.本文将会阐述如何结合MVC的思想帮你的VC瘦身同时提高复用和可扩展性. 一.开发中常见的现象和缺点 iOS中最常见的一种

为Windows 7的winsxs目录瘦身,谨慎。

刚使用Win7 系统不久,前段时间在清理系统垃圾时发现,win7系统的windows文件夹下的winsxs 文件夹占用空间很大,想清理之,却提示无权限无法清理.随即在网上查了个到底,原来winsxs是一个超大的文件仓库,系统所在分区差点儿全部的系统文件都在那里至少有一个备份.并且随着系统的使用,winsxs的所占的空间还将不断的积累壮大,终于将吞噬整个系统分区的磁盘空间.以下附上搜索来的一篇winsxs的具体描写叙述文摘.winsxs的瘦身方法和一篇关于 DLL Hell问题 的描写叙述文摘和大

[转]基于clang插件的一种iOS包大小瘦身方案

转自:http://mp.weixin.qq.com/s?__biz=MzA3ODg4MDk0Ng==&mid=2651112856&idx=1&sn=b2c74c62a10b4c9a4e7538d1ad7eb739 iOS包瘦身,对于一般团队来说并不是优化的首要目标,但是对于一些安装包已经超限的团队来说非常关键.微信和阿里移动安全都分享过相关的内容,后者采用的是去除无用代码的思路,感兴趣的同学可以阅读: iOS瘦身之删除无用的mach-O文件 而本文则将这个思路发挥到了极致,欢迎