你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS編程技術 >> ios - loadView與viewDidload

ios - loadView與viewDidload

編輯:IOS編程技術
  • 從打印結果可以看出,先調用loadView再調用viewDidload
  • 代碼:

//
//  ViewController.m
//  test
//
//  Created by 裴波波 on 16/4/12.
//  Copyright ? 2016年 裴波波. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

-(void)loadView{

    NSLog(@"loadView");
}

- (void)viewDidLoad {

    [super viewDidLoad];

    NSLog(@"viewDidLoad");
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

@end

打印結果

  • 看打印可以了解到先調用了loadview,再調用了viewDidload方法.
  • 為什麼分別調用了兩次?
    • loadView和viewDidLoad的區別就是,調用loadView時view還沒有生成,調用viewDidLoad時,view已經生成了.
    • 當調用loadview時,view為空, -> 調用viewdidload控制器仍然沒有自己的view,此時再次調用loadview方法讓控制器生成一個黑色的view.
    • 注意點: 此時如果調用了loadview當時沒有給viewController指定一個view的話,不能在viewdidload方法中用self.view = 某個view,此時如果調用view的set或者get方法都會使程序進入無限死循環中.看代碼
  • viewDidload中
- (void)viewDidLoad {

    [super viewDidLoad];
    NSLog(@"%p",self.view);
    NSLog(@"viewDidLoad");
}
  • 打印結果

  • 程序陷入無限循環
  • 原因: 調用了self.view就相當於調用了loadview,由於重寫loadview的方法時並沒有給控制器的view指定一個view,所以會一直死循環下去...
  • 解決辦法之一就是在loadview方法中給self.view指定一個view


-(void)loadView{

    UIView * view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
    view.backgroundColor = [UIColor blueColor];
    self.view = view;
    NSLog(@"loadView");
}
  • 此時打印結果

  • 並且模擬器顏色為藍色bluecolor

小結:調用loadview方法,要給控制器指定view.否則在viewdidload方法中調用self.view(view的set或者get方法)都會使程序進入死循環.

  • 如果在loadview與viewdidload中都給控制器指定了view,那麼從調用方法的順序上看可以得到結果:最後被調用的viewdidload方法中的view會覆蓋掉loadview中給控制器設置的view.

  • 為了加深理解看官方文檔
  • 文檔上說:當控制器的view為nil時,會調用這個方法,這個方法會創建一個view給控制器.

  • 如果控制器從xib加載控制的view,則你可以調用此方法來加載xib--> initWithNibName:bundle: 或者不調用此方法,控制器會根據有沒有一個xib名字跟控制器類名一樣的,如果一樣就加載這個跟控制器名字一樣的xib文件作為控制的view.如果沒有xib來初始化控制器的view的話,則這個方法loadview會創建一個空白的view給控制器.

  • 如果用storyboard初始化控制器,就不用調用loadview方法了.

  • 如果重寫這個方法給控制器創建view則這個view必須是一個單例,而且不能被其他的控制器使用.並且不可以調用super
  • 如果想初始化自定義的view,則在viewdidload中初始化即可.

綜上:不建議使用loadview,可以根據自己的需要在storyboard或者viewdidload中創建自己需要的view給控制器.

視圖控制器的生命周期

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved