前言
viewController的代碼應(yīng)該差不多這樣:
要點(diǎn)如下:
所有的屬性都使用getter和setter
不要在viewDidLoad里面初始化view然后addSubview. 在viewDidLoad里面只做addSubview的事情, 屬性的初始化, 則交給getter去做.
比如這樣:
#pragma mark - life cycle
- (void)viewDidLoad
{
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
[self.view addSubview:self.firstTableView];
[self.view addSubview:self.secondTableView];
[self.view addSubview:self.firstFilterLabel];
[self.view addSubview:self.secondFilterLabel];
[self.view addSubview:self.cleanButton];
[self.view addSubview:self.originImageView];
[self.view addSubview:self.processedImageView];
[self.view addSubview:self.activityIndicator];
[self.view addSubview:self.takeImageButton];
[self layoutPageSubviews];
}
- (void) layoutPageSubviews
{
CGFloat width = (self.view.width - 30) / 2.0f;
self.originImageView.size = CGSizeMake(width, width);
[self.originImageView topInContainer:70 shouldResize:NO];
[self.originImageView leftInContainer:10 shouldResize:NO];
self.processedImageView.size = CGSizeMake(width, width);
[self.processedImageView right:10 FromView:self.originImageView];
[self.processedImageView topEqualToView:self.originImageView];
CGFloat labelWidth = self.view.width - 100;
self.firstFilterLabel.size = CGSizeMake(labelWidth, 20);
[self.firstFilterLabel leftInContainer:10 shouldResize:NO];
[self.firstFilterLabel top:10 FromView:self.originImageView];
... ...
}
getter和setter全部都放在最后
一個(gè)ViewController很有可能會(huì)有非常多的view, 如果getter和setter寫在前面, 就會(huì)把主要邏輯扯到后面去, 這樣不方面其他人查看. 寫代碼的時(shí)候按照順序來(lái)分配代碼塊的位置, 先是life cycle
, 然后是Delegate方法實(shí)現(xiàn)
, 然后是event response
, 最后才是getter 和setter
.
每一個(gè)delegate都把對(duì)應(yīng)的protocol名字帶上, delegate寫在一個(gè)區(qū)域
比如UITableViewDelegate的方法集就寫上#pragma mark - UITableViewDelegate
. 方便查找
event response專門開一個(gè)代碼區(qū)域
所有的響應(yīng)事件的處理都放在這個(gè)區(qū)域里面
關(guān)于private methods, 正常情況下ViewController里面不應(yīng)該寫
不是delegate方法的, 不是event response方法的, 不是life cycle方法的, 就是private method了. 正常情況下viewController里面一般是不會(huì)存在private methods的, 寫成一個(gè)category或者做成一個(gè)模塊. 這樣一開始獨(dú)立出來(lái), 方便以后代碼的復(fù)用.
在iOS開發(fā)中, MVC劃分的正確姿勢(shì):
M應(yīng)該做的事情:
1.給ViewController提供數(shù)據(jù)
2.給ViewController存儲(chǔ)數(shù)據(jù)提供接口
3.提供經(jīng)過(guò)抽象的業(yè)務(wù)基本組件, 供Controller調(diào)度
C應(yīng)該做的事情:
1.管理ViewController的生命周期
2.負(fù)責(zé)生成所有的View實(shí)例, 并放入ViewContainer中
3.監(jiān)聽來(lái)自View與業(yè)務(wù)有關(guān)的時(shí)間, 通過(guò)與Model的合作, 來(lái)完成對(duì)應(yīng)事件的業(yè)務(wù)
V應(yīng)該做的事情:
1.相應(yīng)與業(yè)務(wù)無(wú)關(guān)的事件, 并因此引發(fā)動(dòng)畫效果, 點(diǎn)擊反饋等
2.界面元素表達(dá)