在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. 滑雪 (搜索)(dp)(贪心)

    以每一点为起点找出所有路径,并求出以此点做为起点的最大路径 求出每个点的最大路径后再找出其中最大的值,输出最大值 #include <stdio.h>#include <string ...

  2. poj 1631 LIS

    题目链接:http://poj.org/problem?id=1631 #include <cstdio> #include <cstring> #include <io ...

  3. python操作RabbiMQ

    RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息队列(MQ)是一种应用程序 ...

  4. 一键安装lnmp脚本

    前段时间一直在找一个快速部署lnmp环境的方法,也没找着,就自己写了一个,结合网上的大神们的.我的方法是脚本结合源码包,很多依赖裤都是yum安装的,这都在脚本里面,需要的源码包我都下载好了,打包成压缩 ...

  5. motan源码分析九:开关

    在前面的文章中,我们已经发现了开关的踪影,例如cluster,motan支持多个cluster,当前的cluster因为开关关闭的情况下,就会使用下一个cluster. 1.开关相关的类和接口主要都在 ...

  6. 如何提高Lucene构建索引的速度

    如何提高Lucene构建索引的速度 hans(汉斯) 2013-01-27 10:12 对于Lucene>=2.3:IndexWriter可以自行根据内存使用来释放缓存.调用writer.set ...

  7. Spring4.0支持Groovy配置

    介绍 前一段时间观注了一下Spring4.0的一些特性,当中就有对Groovy配置的支持.因为临时还没有很深入的研究.所以举个小样例来说明一下怎样支持Groovy配置. package shuai.s ...

  8. How to load jars residing over NFS in JBossAS7 classpath ? --reference

    In this article we will discuss how can we load jars residing over NFS in JBoss AS-7 classpath. In s ...

  9. scala中常用但其他语言不常见的符号含义

    本文旨在介绍Scala在其他语言中不太常见的符号含义,帮助理解Scala Code. 随着我对Scala学习的深入,我会不断增加该篇博文的内容. 修改记录 ----2016.11.23  新增scal ...

  10. Camera2Raw

    This sample demonstrates how to use the Camera2 API to capture RAW camera buffers and save them as D ...