本来文章标题想起为“OC开发之我想分享的一些东东”,然后大概整理了下,发现还挺多的,所以我觉得还是分开写好。想分享的大部分是代码思路、习惯上的一些。今天就先分享如题的东东
步入正题:
先上一段代码
这个方法实在太大就先截这么多吧,cell的创建、UI的渲染都在这个代理方法中,而且cell用的原生cell,再去add,这种代码真真儿是很让人蛋疼的,试想一下,现在让你去改cell的UI,我打赌你会选择重写,但是重写也要看懂老逻辑😭😭😭
这种cell,虽然是自己定义了cell,没有上面那个那么low,但是cell的渲染逻辑全部在这里,而且通过tag去拿cell里的控件着实是low
这种代码的问题是:
- 让 data source 变得混乱,因为它向 data source 暴露了 cell 的设计
- 非常不利于阅读、维护和测试
相比于上面的代码我推荐的做法也是我现在的做法如下:
cell的创建、cell的渲染都放到cell中来
eg:
// xib
+ (instancetype)cellWithTableView:(UITableView *)tableView {
static NSString *ID = @"ApplyForCellTop";
ApplyForCellTop *cell = [tableView dequeueReusableCellWithIdentifier:ID];
if (cell == nil) {
cell = [[[NSBundle mainBundle]loadNibNamed:@"ApplyForCell" owner:0 options:nil]firstObject];
}
return cell;
}
// 纯代码
+ (instancetype)cellWithTableView:(UITableView *)tableView {
static NSString *ID = @"SettingTableViewCell";
SettingTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
if (cell == nil) {
cell = [[SettingTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
return cell;
}
// cell的渲染
- (void)setModel:(Model_CardOfMine_Cell *)model {
_model = model;
self.cardName.text = _model.cname;
self.cardNum.text = _model.cuid;
self.cardOfMerchantName.text = _model.bname;
self.cardPrice.attributedText = [UtilOfShowCardPrice getCardAttributePriceStrBy:_model.rate andFontSize:self.cardPrice.font.pointSize];
;
self.cardInfo.text = _model.about;
}
现在回过头来看我们dataSource的代理实现
是不是简洁了许多!
上面例子中cell的渲染是重写set方法,cell需要有model这个属性。这边的实现是多种多样的,有model的项目我可以声明一个renderCellByModel,无model的项目我可以声明一个renderCellByDictionary等
类似于这种的,cell选中和未选中状态下view的样式都可以放到这边去处理,不要给dataSource放太多的实现、分散开来你会发现下次修改这边的代码不管是你还是其他人都是比较愉悦的。
例子中是一个类型的cell的处理方式,可是现实开发中我们往往会定义很多种cell,这个时候该怎么处理呢?这个涉及到方法的设计了,不在本篇讨论范围中
好,整洁的TableView大概就是这样了,至于网上一些人推崇的将dataSource和delegate分离出来的,我是真心没发现好处。下面说说瘦身UIViewController。
当你面对一个上千行的UIVIewController代码时,我相信你和我的内心都是崩溃的。
其实瘦身很简单,严格按照MVC设计思想设计就行了,别把所有的逻辑(渲染逻辑、业务逻辑等)都放到Controller中
举个栗子:
我们来仿一下淘宝的这个页面,VC(UIViewController简称)
画个UML吧,好解释
这个VC种就包含两个view:indexView和filterView
indexView中也包含两个view:topView就是那些按钮的容器,collectionView就是下面的那个view
此时VC就只负责什么时候让view去render页面,view上的一些事件我们可以block或者delegate一步步回调回来VC去处理,这样一番设计下来VC不就一下子瘦下来了么😆😆😆
推荐两本好书
- 《编写高质量iOS代码的52个有效方法》
- 《PRODUCTOR》
推荐源码阅读
- 强烈推荐看看SDWebImage源码(虽然好多我都不会,但是学到的很多很多!)
希望会给大家带来帮助(o)/~