1 生命周期
- init方法中view仍然是nil,此時,如果寫了self.view,直接調用loadView。
- 看名字也知道,loadView在viewDidLoad之前。
initWithNibName:bundle:
,designated初始化方法
2 代碼組織
- init,只有需要傳一些參數的時候,才需要 不要出現self.view,只做普通屬性賦值(如model,詳情頁url等)
- viewDidLoad中 組裝好subview
- viewWilAppear中 處理數據相關,處理系統級任務(比如statusbar、網絡監聽等)
- viewDidLayoutSubviews中 處理布局
- subview在getter中初始化
- 瘦身 ViewModel/Present + category、RAC
一個不符合規范的案例,會導致錯誤。
//first vc
+ (instancetype)initWithUrl:(NSString *)url {ViewController *controller = [ViewController new]; //已經在next vc的init中執行了viewDidLoad,而此時url還沒有傳過去controller.url = url;return controller;
}//next vc
#pragma mark - life cycle
- (instancetype)init {self = [super init];if(self) {[self.view addSubview: self.webView]; //應該寫在viewDidLoad中}return self;
}- (void)viewDidLoad { //下面兩句應該寫在viewWillAppear:中[self startLoading];[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.url]]];
}
復制代碼
3 一些應用
3.1 ChildVC + ScrollView
比如頭條,上面有一個橫拉的欄目View,下面才是ChildVC的view 做法:ScrollView + VCs
- ScrollView中實際上是多個childVC的根view
- 創建childVC的時候,設置好frame,包括橫向偏移量。
注意
- 因為[scrollView addSubview:childVC.view],已經調用了childVC.view,所以這是已經調用了childVC的loadView和viewDidLoad方法。
addChildViewController
后,childVC的生命周期方法,如viewWillAppear、viewDidAppear等,就跟隨父VC了自動處理。
優化:
- 可以使用displayVC,cachedVCs,緩存數組,內存預警或進入后臺時清理cachedVCs。
- 點擊專欄引發的更換VC,
/添加一個 childViewController
UIViewController *vc = [UIViewController new];
[self addChildViewController:vc];
vc.view.frame = ..;
[self.view addSubview:vc.view];
[vc didMoveToParentViewController:self];//移除一個 childViewController
[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
復制代碼
3.2 ChildVC + UIPageViewController
實現相冊瀏覽功能,圖片放縮
4 通用做法
4.1 隱藏狀態欄
#pragma mark - statusbar
-(BOOL)prefersStatusBarHidden {return YES;
}
復制代碼