代码写的多了有时你会发现,常见的tableview无非是加上下刷新,加载接口,自定义Cell,传入数据模型,千篇一律,但你又不得不去写,干脆就去ctrl+c和ctrl+v,那么能不封装一个tableview,一个初始化就搞定呢,答案是可以的。在写之前你必须了解这个封装tableView的使用限制
- 你的自定义Cell不能有复杂的交互,比如长按手势,accessoryView带Button等,当然,你可以自己去加代理去实现这些功能,但这会破坏封装的通用性
- 自定义Cell最好是autolayout布局(案例中使用masonry框架)
- 点击事件需使用代理实现,不能封装.
下面讲一下封装思路
1、确定初始化方法的传参
2、确定使用的三方框架,这里我使用了
XMNetworking、Masonry、MJExtention、MJRefresh
你可以根据自己项目中的框架做适当的改变
关键性代码片段
/**
封装的自定义tableView初始化方法
@param url 接口地址
@param paramters 接口传参(一般列表请求都是POST请求)
@param cellClassName 自定义Cell的类名
@param modelClassName model模型类名
@param cellModelName model在Cell中的属性名
@return table
*/
- (instancetype)initWithRequestUrl:(NSString *)url paramters:(NSMutableDictionary *)paramters cellClassName:(NSString *)cellClassName modelClassName:(NSString *)modelClassName cellModelName:(NSString *)cellModelName;
-(instancetype)initWithRequestUrl:(NSString *)url paramters:(NSMutableDictionary *)paramters cellClassName:(NSString *)cellClassName modelClassName:(NSString *)modelClassName cellModelName:(NSString *)cellModelName{
if (self = [super init]) {
_url = url;
_paramters = paramters;
_cellClassName = cellClassName;
_modelClassName = modelClassName;
_cellModelName = cellModelName;
self.backgroundColor = TableBackgroundColor;
[self registerClass:NSClassFromString(cellClassName) forCellReuseIdentifier:@"Cell"];
self.estimatedRowHeight = 100.f;
self.delegate = self;
self.dataSource = self;
self.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
_page = 1;
[self loadData];
}];
self.mj_footer =[MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
_page++;
[self loadData];
}];
}
return self;
}