在IOS开发中采用了MVC得模式,ViewController通常是最庞大的文件,里面包含了各种各样的大概,造成代码的复用率低下,可读性也降低,那么有什么办法来解决这个问题呢。

在创建Table的时候,绑定数据源需要实现三个委托

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

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

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

每次写表格都要重新实现这三个方法,有没有什么方法可以复用这些代码呢。

我们来分析一下,一般表格的数据源都是一个数组。Cell的数量就是数组的数量,那么既然找到了规律,我们就可以吧这一部分的代码提取出来。

分离DataScource

我们先来新建一个类叫做ArrayDataSource

首先有一个- (id)initWithItems:(NSArray *)anItems multipleItem:(BOOL)multipleItem cellIdentifier:(NSString *)aCellIdentifier configureCellBlock:(TableViewCellConfigureBlock)aConfigureCellBlock;方法用来初始化。它有四个参数,第一个items,很显然这个是数据源的数组,第二个multipleItem是一个BOOL类型的值,用来说明传入的数组是否是多维数组,用以Group类型的表格数据源传入,第三个aCellIdentifier 是cell的标识符,复用cell的时候会用到,第四个参数是aConfigureCellBlock 一个配置cell的Block回调方法。

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h> typedef void (^TableViewCellConfigureBlock)(id cell, id item); @interface ArrayDataSource : NSObject <UITableViewDataSource,UITableViewDelegate> /**
* 初始化表格方法
* 根据数据源自动计算出数量,支持二位数组
* 使用二维数组的时候,将multipleItem值设为YES即可完成数据的输入
*
* @param anItems 数据源
* @param aCellIdentifier cell标示符
* @param aConfigureCellBlock 配置cell方法的block回调方法
*
* @return id
*/
- (id)initWithItems:(NSArray *)anItems
multipleItem:(BOOL)multipleItem
cellIdentifier:(NSString *)aCellIdentifier
configureCellBlock:(TableViewCellConfigureBlock)aConfigureCellBlock; - (id)itemAtIndexPath:(NSIndexPath *)indexPath;
@end

ArrayDataSource.h

@implementation ArrayDataSource

- (id)initWithItems:(NSArray *)anItems
multipleItem:(BOOL)multipleItem
cellIdentifier:(NSString *)aCellIdentifier
configureCellBlock:(TableViewCellConfigureBlock)aConfigureCellBlock
{ self = [super init];
if (self) {
_items = anItems;
_cellIdentifier = aCellIdentifier;
_configureCellBlock = [aConfigureCellBlock copy];
_isMultiple=multipleItem;
}
return self;
} - (id)itemAtIndexPath:(NSIndexPath *)indexPath
{
return [_items objectAtIndex:indexPath.row];
} - (NSInteger)tableView:(UITableView*)tableView
numberOfRowsInSection:(NSInteger)section {
if(_isMultiple)
{
return [[_items objectAtIndex:section] count];
}
else
{
return [_items count];
}
} - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
if (_isMultiple) {
return [_items count];
}
else
{
return 1;
}
} - (UITableViewCell*)tableView:(UITableView*)tableView
cellForRowAtIndexPath:(NSIndexPath*)indexPath {
id cell = [tableView dequeueReusableCellWithIdentifier:_cellIdentifier
forIndexPath:indexPath];
if (_isMultiple) {
NSArray *Sectionitem = [_items objectAtIndex:indexPath.section];
self.configureCellBlock(cell, [Sectionitem objectAtIndex:indexPath.row]);
//self.configureCellBlock(cell, @"fdgdf");
}
else
{
id item = [self itemAtIndexPath:indexPath];
self.configureCellBlock(cell, item);
} return cell;
}

以上就是这个简单类的部分代码,接下来我们来看一下如何简单的实现数据源的传入

TableViewCellConfigureBlock configureCell = ^(UITableViewCell *cell, NSString *photo) {
cell.textLabel.text=photo;
};
NSArray *item1= @[@"sasewrwer",@"f22f",@"fff"];
NSArray *item2= @[@"sas",@"ff",@"gfdfsd"];
NSArray *item= @[item1,item2]; _photosArrayDataSource = [[ArrayDataSource alloc] initWithItems:item
multipleItem:YES
cellIdentifier:@"cell"
configureCellBlock:configureCell];
self.tableView.dataSource = _photosArrayDataSource;
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell"];

只需要三四行代码即可完成Table的数据源传入,而不用再去实现Delegate,这样使得ViewController的代码更加简洁,代码的重用性变高。

思路来源于objcio

以上代码在GitHub可以下载,仅供参考

为UITableViewController瘦身的更多相关文章

  1. iOS UIViewController的瘦身计划

    代码的组织结构,以及为何要这样写. 那些场景适合使用子控制器,那些场景应该避免使用子控制器? 分离UITableView的数据源和UITableViewDataSource协议. MVVM的重点是Vi ...

  2. Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)

    Android XML shape 标签使用详解   一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...

  3. Android APK瘦身之Android Studio Lint (代码审查)

    ******** ******** 第一部分: 瘦身内容介绍 ******** ******** 项目新版本的迭代接近尾声, 因为历史累积问题, 导致有很多无效的资源让已经臃肿的APK变得更肿, 因此 ...

  4. 【直播】APP全量混淆和瘦身技术揭秘

    [直播]APP全量混淆和瘦身技术揭秘 近些年来移动APP数量呈现爆炸式的增长,黑产也从原来的PC端转移到了移动端,通过逆向手段造成数据泄漏.源码被盗.APP被山寨.破解后注入病毒或广告现象让用户苦不堪 ...

  5. APK瘦身记,如何实现高达53%的压缩效果

    作者:非戈@阿里移动安全 1.我是怎么思考这件事情的 APK是Android系统安装包的文件格式,关于这个话题其实是一个老生常谈的题目,不论是公司内部,还是外部网络,前人前辈已经总结出很多方法和规律. ...

  6. iOS可执行文件瘦身方法

    缩减iOS安装包大小是很多中大型APP都要做的事,一般首先会对资源文件下手,压缩图片/音频,去除不必要的资源.这些资源优化做完后,我们还可以尝试对可执行文件进行瘦身,项目越大,可执行文件占用的体积越大 ...

  7. 清理iOS工程里无用的图片,可瘦身ipa

    工程在经过多人后,往往会出现较多的垃圾,导致打包出来的ipa文件偏大,有时候我们会通过清理代码来给程序瘦身,而瘦身ipa效果明显的,主要通过清理程序里的无用图片. 推荐一个清理图片的应用 https: ...

  8. iOS - Bitcode App 瘦身中间码

    1.Bitcode 随着 Xcode7 的发布,Apple 提供了一项新的技术来支持 App 瘦身功能,那就是 Bitcode. 1.BitCode 是什么 Bitcode is an interme ...

  9. iOS架构师之路:控制器(View Controller)瘦身设计

    前言 古老的MVC架构是容易被iOS开发者理解和接受的设计模式,但是由于iOS开发的项目功能越来越负责庞大,项目代码也随之不断壮大,MVC的模糊定义导致我们的业务开发工程师很容易把大量的代码写到视图控 ...

随机推荐

  1. Dividing (多重背包 搜索)

    / 第一个多重背包题目 真的不理解二进制优化 /http://acm.hdu.edu.cn/webcontest/contest_showproblem.php?cid=10594&pid=1 ...

  2. 【最短路】血色先锋军(scarlet) 解题报告

    问题来源 BYVoid魔兽世界模拟赛 [问题描述] 巫妖王的天灾军团终于卷土重来,血色十字军组织了一支先锋军前往诺森德大陆对抗天灾军团,以及一切沾有亡灵气息的生物.孤立于联盟和部落的血色先锋军很快就遭 ...

  3. SANSA 上上洛可可 贾伟作品 高山流水 香炉 香插香台香具 高端商务礼品 黑色【正品 价格 图片 折扣 评论】_尚品网ShangPin.com

    SANSA 上上洛可可 贾伟作品 高山流水 香炉 香插香台香具 高端商务礼品 黑色[正品 价格 图片 折扣 评论]_尚品网ShangPin.com

  4. Postman 安装 & 资料

    安装 下载地址: http://chromecj.com/web-development/2014-09/60/download.html 怎么在谷歌浏览器中安装.crx扩展名的离线Chrome插件? ...

  5. hdoj 1513 Palindrome【LCS+滚动数组】

    Palindrome Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  6. serialVersionUID的作用以及设置方法(转)

    声明:本篇文章是转载的 http://blog.csdn.net/kakaxi_77/article/details/8129070 http://snowlotus.iteye.com/blog/2 ...

  7. 关于URL重写

    1.  为什么要使用url重写? 先从session的原理讲起,为什么我们能够获得session中的东西呢?如果没有禁用cookie的话,那么session创建之后,会将session id的值通过r ...

  8. Amoeba for MySQL 非常好用的mysql集群软件

    http://docs.hexnova.com/amoeba/ Amoeba for MySQL致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当query 路由功能,专 ...

  9. [CSS3] Using CSS Combinators to Identify Siblings and Descendants in CSS

    CSS combinators allows us to reference the DOM relationship between two or more elements in CSS. < ...

  10. [转] C语言多维数组与多级指针

    http://c.biancheng.net/cpp/html/477.html 多维数组与多级指针也是初学者感觉迷糊的一个地方.超过二维的数组和超过二级的指针其实并不多用.如果能弄明白二维数组与二级 ...