iOS怎样打造轻量级Controller

我是楼上哥哥。1、从mvc的角度来讲,你的view脱离controller那么谁负责view的生命周期?view如何复用?如何与model通信?如果你说的是解除view 和controller之间的耦合,可以用中介者模式解除。2、把datasource和delegate包一层,用block暴露接口。但是...注:另外嫌弃controller“重”也太随性了吧,题主不妨说说你理解的“轻量级”。我不认为uitableview的delegate和datasource“很重”;而这种设计恰恰是你目前应该仔细体悟和学习的。推荐题主看一看斯坦福的iOS开发公开课,多看多模仿。
■网友
如何分离TableView和Controller?我们在上古时代有一种实践是这样的:有一个ListViewController的基类,它有一个tableView,姑且算是“分离”了TableView的Delegate和DataSource的TableView的Controller,它有一个optional的protocal,里面有两个属性两个方法:@property (strong, nonatomic) ListViewDelegate *delegate;@property (strong, nonatomic) ListViewDataSource *dataSource;- (void)createDelegate;- (void)cteateDataSource;这两个方法,在viewDidLoad的时候会被调用,然后再根据具体的ListViewController的子类去子类化ListViewDelegate和ListViewDataSource,它们的基类分别服从UITableView的delegate和dataSource协议,在delegate和dataSource的子类中去实现或者复写对应的delegate和dataSource方法即可。如何将TableView的DataSource和Delegate里重要的代理写成Block的形式?什么是重要的代理?require去实现的?那好像只有这俩:-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;如果要说点击时间也算进去那就是三个,你说要写成Block的形式?我倒是没有这样做过,不过如果真要写成这样写开了倒也不是不行,你可以给delegate加一个Block的Array,然后让delegate的基类默认实现一下didSelectedRowAtIndex这个方法,然后去遍历那个Array去执行Block看上去也行。写成Block可以把- (void)createDelegate;写成- (void)createDelegateWithDidSelectedActions:(NSArray *)actions;?至于dataSource的方法,好像也同理了,- (void)cteateDataSourceWithCellClasses:(NSArray *)classes;?然而这样真的好么?“然而这并没有什么卵用”,在后来重构实践中我发现并不好,而且还蛮糟糕的,一个很常见的情形就是一个tableView的Controller不只是处理关于tableView的逻辑和数据和UI,还可能处理包括不限于headerView、footerView、alertView、actionSheet的数据逻辑UI、还可能有奇怪的刷新重新载入、根据不同的数据加载不同的以上的view的等等。Controller作为MVC中连接model和view的桥梁本来就是做这些事情的,真要说轻量级···tableView看上去好像还可以这么干一下,部分弹出视图也可以封装一下外,更多的数据处理和逻辑感觉更应该就是由Controller去做的,看上去并不需要做过多的文章。其实对于tableView的delegate和dataSource这个分离我有时候都会感觉很麻烦,不时会出现拿到的数据Controller也要用dataSource也要用的情况,以及有些时候为Cell计算高度或者添加一些动画,结果出现了重用符或者CellClass一边有一边没有导致有时候获取或者维护Cell逻辑和数据分离非常不直观,同时更要命的多数情况model会更新或者一些影响controller中其他视图的逻辑,分离的delegate和dataSource又有一个weak的controller的引用,所以实际上并没有实现完全分离的效果,还是藕断丝连。同时由于tableView是构建应用的中坚力量,渐渐你还会发现随着项目规模变大会创建出数不尽的delegate和dataSource文件,看着相当痛苦。说到后面全成吐槽了,然而这都是这样实践后的一些感受,题主请选择性忽略。


推荐阅读