以Manager组合实现tableView与VC解耦

前言:笔者刚工作不久、而且是和一个即将离职的同事做工作交接。所以工作两个月以来基本都是在修前人的代码。然后、出现了这样一个问题。

屏幕快照 2016-05-30 下午1.14.42.png

没错、我们的页面有很多格式相似需要统一配置的列表、而截图只是其中一小部分。笔者一开始对结构项目不熟、UI也是刚来没多久。所以在UI提出新改动的时候、出现了很多次个别页面漏改的情况(footer底色啊、高度啊、下方分割线是否显示啊之类0.0)。需求改一点、就要把每个VC里的tb设置全部都改一遍实在是心累~

再然后、项目里的商品详情、也分出了三个模式


屏幕快照 2016-05-30 下午1.22.52.png

没错、每个模式列表的样式又有着些许的差别。于是乎项目里又出现了各种判断~


屏幕快照 2016-05-30 下午1.26.07.png

暂时这样写问题不大、但是想想、将来需求累加起来。单一模式的布局一改、就开始复杂了。

恰巧前阵子在看网络层架构、感受到了很多NetworkManager的好处。所以想试试能不能通过一个统一的列表管理器(ListManager)来统一调配项目中大部分风格一致的列表。于是、就有了以下的尝试。

——————————————正文——————————————————
以下、笔者只大概提出思路。毕竟对于菜鸡、言多必失。

1、ListManager

既然是Manager、必然要起到管理器的作用。

1.1 配置统一的tableView
要把尽量多的配置、交付给Manager、从而减轻了VC的压力。
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
//实现代理方法以代理方法为准
if ([self.delegate respondsToSelector:@selector(LMnumberOfSectionsInTableView:)]) {
return [self.delegate LMnumberOfSectionsInTableView:tableView];
}
//否则以默认为准
return Y;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
//可以根据VM配置、也可以手动配置
if ([self.delegate respondsToSelector:@selector(LMtableView:numberOfRowsInSection:)]) {
    return [self.delegate LMtableView:tableView numberOfRowsInSection:section];
  }
return X;
}

1.2 暴露代理API给VC、以备不时之需。上面的判断、就是那个意思。这样我们在控制器中实现之后、就可以覆盖manager中的原装设置

/* 暴露tableView代理方法至listManager所依赖控制器 */
- (NSInteger)LMnumberOfSectionsInTableView:(UITableView *)tableView;

- (CGFloat)LMtableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;

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

- (UIView *)LMtableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section;

- (UIView *)LMtableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;
。。。。。。。。

1.3 cell配置的实现
既然是统一配置、必然不可能把每个cell写进来所以、我们需要一个协议、用来约束cell。当然、下面的参数并不是充要条件、我只是copy了自己demo里的代码

@protocol BaseListManagerCellDelegate <NSObject>
@optional
 /**
 *  配置cell统一方法
 *  @param model     ListVM
 *  @param indexPath indexPath
 *  @param target    cell事件代理 将cell协议事件统一交由listmanager的代理实现
 *  如果cell需要代理回调事件、务必设置listmanager代理
 */

- (void)configurationCellWithModel:(BaseListModel*)model indexPath:(NSIndexPath *)indexPath target:(id)target;

于是乎、在所需cell遵循了协议之后、我们可以在ListManger中直接通过协议配置cell、如此这般
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
//Manager所属cell必须遵循协议。实现配置方法
//@"cellID"是我们在VC中需要做的、注册cell给manager
UITableViewCell<BaseListManagerCellDelegate> * cell = [tableView dequeueReusableCellWithIdentifier:@"cellID"];
// 通过协议方法配置cell
[cell configurationCellWithModel:model indexPath:indexPath target:self.delegate];
return cell;
}

2、ListModel

其实这个Model可有可无。如果你习惯FatModel或者MVVM。可以尝试添加进去如果公司的网络层统一度比较不错。简单页面用用、还是挺省事的

内部就不写了~毕竟每个公司网络架构都不同。心意到了就好。同样是copy的demo、不要太在意细节0.0

@interface BaseListModel : NSObject
@property (nonatomic) NSMutableArray *dataArray;
//关于数据源~我不是很喜欢里面放一个个model。不过放啥都无所谓了。不是重点呗~
@property (nonatomic) NSInteger page;
/* 请求url */
@property (nonatomic) NSString *dataUrl;
/* 删除url 不传入则不具备删除功能 */
@property (nonatomic) NSString *deleteDataUrl;
/* 删除的key 需要删除功能时必须传入*/
@property (nonatomic) NSString *deleteKey;
/**
 *  翻页
 */
- (void)next;

/**
 *  刷新
 */
- (void)freshenDataArray; 
/**
 *  删除
 *
 *  @param integer 数据位置
 */
- (void)deleteDataArrayAtIndex:(NSInteger)integer;

哦对~ListModel在实际的使用中、还可以暴露出几个API。毕竟很多时候在请求之后、页面还需要不同的提示啊、之类么0.0

@protocol KiritoListModelDelegate <NSObject>
@optional
/**
 *  刷新开始前代理
 *
 *  @return 继续执行model方法返回Yes 屏蔽返回No
 */
- (BOOL)modelBegainLoadDate;
- (void)modelEndLoadDate:(NSDictionary *)json;
/**
 *  删除开始前代理
 *
 *  @return 继续执行model方法返回Yes 屏蔽返回No
 */
- (BOOL)modelBegainDeleteDataAtIndex:(NSInteger)index;
- (void)modelEndDeleteData:(NSDictionary *)json;

想不起来还应该交待点什么、干脆再重申一次。FatModel并不是充要条件。

3、使用
我也不知道该说啥~反正感觉不太难0.0。贴一个项目里的使用吧


屏幕快照 2016-05-30 下午2.45.16.png

嗯、只需要配置一些充要条件。除非有什么特殊需求需要用API颠覆manger的配置。不然就不再用写啥了

4、总结

这并不是我造的轮子、充其量是一个思想而已。

我想解决的问题:(其实就是前言里写的状况~)
第一、既然网络层可以通过manager统一设置、为什么表现层的列表们不去交给相应的manager统一配置、每天搞很多重复工作真的很累。一旦UI有新Idea、真的很累、真的...
第二、一旦同一个页面有太多不同的模式。与其在cellForRow/height/footer/header里写很多判断。何不干脆单独写出三个manager。通过为VC装载不同的manager实现不同的页面配置。(对~这里就是组合

4、最后
第一次写博客、不知道有没有阐述明白。如果哪里不对、望轻拍。我会虚心接受的。
所以、还是贴demo吧~OC的Demo写的乱七八糟、而且没有注释。所以、Demo是Swift的、看看注释就好了。
下载链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容

  • iOS网络架构讨论梳理整理中。。。 其实如果没有APIManager这一层是没法使用delegate的,毕竟多个单...
    yhtang阅读 5,160评论 1 23
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,373评论 25 707
  • 前些日子,听朋友谈起《煮酒探西游》这本书,起先觉得有趣,于是就看了看,可后来发现越看越离谱,这本书已经把吴承恩的原...
    糖点什么阅读 526评论 0 1
  • 今天刷完牙,无意间舌尖触碰到唇上的一个小坑,才蓦然反应过来,困扰了我好多天的口腔溃疡已经好了。 好了伤疤忘了疼,今...
    PM从零单排阅读 576评论 0 0