UIViewController 小結

1 生命週期

  1. init方法中view仍然是nil,此時,若是寫了self.view,直接調用loadView。
  2. 看名字也知道,loadView在viewDidLoad以前。
  3. initWithNibName:bundle:,designated初始化方法

2 代碼組織

  1. init,只有須要傳一些參數的時候,才須要 不要出現self.view,只作普通屬性賦值(如model,詳情頁url等)
  2. viewDidLoad中 組裝好subview
  3. viewWilAppear中 處理數據相關,處理系統級任務(好比statusbar、網絡監聽等)
  4. viewDidLayoutSubviews中 處理佈局
  5. subview在getter中初始化
  6. 瘦身 ViewModel/Present + category、RAC

一個不符合規範的案例,會致使錯誤。web

//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 + VCsobjective-c

  • ScrollView中其實是多個childVC的根view
  • 建立childVC的時候,設置好frame,包括橫向偏移量。

注意數組

  1. 由於[scrollView addSubview:childVC.view],已經調用了childVC.view,因此這是已經調用了childVC的loadView和viewDidLoad方法。
  2. addChildViewController後,childVC的生命週期方法,如viewWillAppear、viewDidAppear等,就跟隨父VC了自動處理。

優化:緩存

  1. 能夠使用displayVC,cachedVCs,緩存數組,內存預警或進入後臺時清理cachedVCs。
  2. 點擊專欄引起的更換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

實現相冊瀏覽功能,圖片放縮bash

4 通用作法

4.1 隱藏狀態欄

#pragma mark - statusbar
-(BOOL)prefersStatusBarHidden {
    return YES;
}
複製代碼
相關文章
相關標籤/搜索