2015-08-16 57 views
0

我想測試viewDidLoad中和的loadView之間的區別,所以我創建一個單一視圖的應用程序和超過設定的didFinishLaunchingWithOptions如流:viewDidLoad中和的loadView問題

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    viewController = [[MyViewController alloc] init]; 
// viewController.view.backgroundColor = [UIColor redColor]; 
    self.window.rootViewController = viewController; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

在我MyViewController的M檔是流動:

#import "MyViewController.h" 

@interface MyViewController() 

@end 

@implementation MyViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    NSLog(@"%@",self.view); 
    self.view.backgroundColor = [UIColor redColor]; 
    // Do any additional setup after loading the view. 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (void)loadView { 
    self.view = [[UIWebView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame]; 
} 

@end 

但loadView方法或viewDidLoad沒有被調用。爲什麼?但是當我在didFinishLaunchingWithOptions取消註釋時,他們都被調用。

回答

1

爲什麼viewDidLoad中不叫?

發生此行爲是因爲你的窗口是零。所以你的控制器沒有顯示,它的視圖也沒有加載。

試試這個:

self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 
ViewController *viewController = [[ViewController alloc] init]; 
// viewController.view.backgroundColor = [UIColor redColor]; 
self.window.rootViewController = viewController; 
[self.window makeKeyAndVisible]; 

爲什麼如果註釋掉此行viewController.view.backgroundColor = [UIColor redColor];的viewDidLoad中被調用?

UIViewController的視圖是延遲加載。如果取消在didFinishLaunchingWithOptions註釋,雖然你的控制器沒有顯示,但你訪問它的view財產,那麼該觀點被加載,然後將被丟棄。

+0

它工作,我也找到它了。謝謝你的回答。 – Scott

+0

我可以說,當我們使用self.view,如果視圖爲零,方法loadView會調用? – Scott

+0

你說得對。 'viewDidLoad'將在'loadView'之後執行。 – Bannings

1

我只是檢查與簡單的例子:

@implementation TestViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    NSLog(@"test"); 
} 

- (void)loadView 
{ 
    NSLog(@"load"); 
} 

@end 

,它工作正常:

2015-08-16 13:18:46.163 Example[51603:406197] load 
2015-08-16 13:18:46.164 Example[51603:406197] test 
2015-08-16 13:18:46.164 Example[51603:406197] load 
2015-08-16 13:18:46.164 Example[51603:406197] test 

這裏是代表:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window.rootViewController = [TestViewController new]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

更新#1

我忘了關於默認storyboa我有。我不使用它,但它是在代表要求window屬性初始化:如果您的應用程序的Info.plist 文件包含UIMainStoryboardFile關鍵

這個屬性的實現是必需的。幸運的是,Xcode的 項目模板通常包括 屬性的應用程序委託合成宣言自動。此 合成屬性的默認值是零,這將導致該應用創建的通用 一個UIWindow對象,並將其分配給屬性。如果您想爲您的應用程序提供 自定義窗口,你必須實現的 此屬性的getter方法,並用它來創建並返回您的自定義窗口。

+0

你可以嘗試:刪除故事板或筆尖,然後運行它 – Scott

+0

我認爲很簡單的解決方案將是有默認的故事板。我不使用IB作爲用戶界面,但這使事情變得簡單。 –

+0

問題的關鍵是窗口不會是零,並且'UIViewController'的'view'屬性是延遲加載。 – Bannings

1

「的loadView」 當self.view被調用,self.view是零被調用,因此,如果您取消註釋

viewController.view.backgroundColor = [UIColor redColor]; 

你從字面上叫自我。視圖,它會調用(內部)「loadView」,然後「viewDidLoad」。

我想這是因爲「self.window」未初始化,「loadView」和「viewDidLoad」未被調用。

+0

這是正確的,謝謝了很多。 – Scott