偶然在objc.io中看过一篇关于controller瘦身的文章.之后又从唐大神的公众号那了解到了一些给VC减肥的方法,以下是习笔记:
controller由于其独特性,在很多情况下是不能复用的,当然造成controller不能复用的原因之一就是:其VC种处理view赋值懂的逻辑代码太多,这部分代码由于其特殊性,在每个VC中又不是一样的,所以给VC减肥,首先需要我们把VC中处理view的逻辑抽离出来.举个例子:
我们用的UITableview,这个ui控件在我们项目种所使用的频率是极其高的,通常我们一个VC里面可能就只会有一个tableview作为唯一的元素.然后VC中大部分代码都是关于负责显示这个tableview的,思考一下,我们是不是可以把负责显示这个tableview的代码抽离出去.
首先,继承nsobject
在.h文件中声明
#import
typedefvoid(^retuneCell)(idcell,idindexPath);
@interfaceMVVM :NSObject
- (instancetype)initStr:(NSString*)str arr:(NSArray*)arr bolck:(retuneCell)block;
- (id)cellAtIndexPath:(NSIndexPath*)indexPath;
@end
在.m文件中
#import"MVVM.h"
@interfaceMVVM()
@property(nonatomic,strong)NSString*str;
@property(nonatomic,strong)NSArray*arr;
@property(nonatomic,copy)retuneCellblock;
@end
@implementationMVVM
- (instancetype)initStr:(NSString*)str arr:(NSArray*)arr bolck:(retuneCell)block
{
if(self= [superinit]) {
self.str= str;
self.arr= arr;
self.block= block;
}
returnself;
}
- (id)cellAtIndexPath:(NSIndexPath*)indexPath
{
returnself.arr[indexPath.row];
}
- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
{
returnself.arr.count;
}
- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
UITableViewCell*cell = [tableViewdequeueReusableCellWithIdentifier:self.strforIndexPath:indexPath];
cell.tag= indexPath.row;
self.block(cell, indexPath);
returncell;
}
@end
这样,我们就完全把VC负责页面显示的代码剥离出来了,然后我还可以给这个类绑定到一些ui控件上,当我们完成某一个特定操作的时候,动态的改变这个类.