2011-09-11 71 views
5

我想以編程方式在NavigationController中設置一個UIViewController,但loadView或viewDidLoad方法被調用。UIViewController的loadView不叫

這是我在應用程序委託代碼:

MyViewController *viewController = [[MyViewController alloc] init]; 
UIView *view = [[UIView alloc] initWithFrame:window.frame]; 
viewController.view = view; 

UINavgationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController]; 

[window addSubview:[navController view]; 
[window makeKeyAndVisible]; 

當我啓動應用程序,我看到一個導航欄,但沒有調用的loadView。我錯過了什麼? 我還以爲你叫view

編輯

MyViewController *viewController = [[MyViewController alloc] init]; 
[viewController view]; // doesn't look right? 

UINavgationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController]; 

[window addSubview:[navController view]; 
[window makeKeyAndVisible]; 

對約拿的評論編輯後的loadView被調用,但仍的loadView不會被調用。

回答

10

UIViewController將創建其視圖(通過從筆尖加載它或執行-loadView)當控制器的view吸氣劑被稱爲其觀點是目前nil

在顯示的代碼中,您從不調用視圖屬性的getter,只調用其setter。

此外,您正在從您的應用程序委託分配控制器的視圖。有望在需求中創建自己的觀點,而不是由其他類別提供。當您意識到控制器卸載其視圖並嘗試重新創建它以響應內存警告時,此方法稍後會導致您遇到問題。讓你的控制器創建它的視圖,不要試圖傳遞它。

+0

關於你的第二條評論,分配視圖,你的意思是我的第二和第三行代碼,對吧?這就說得通了。但是,在這種情況下,我將如何調用getter? –

+0

''[viewController view]'調用視圖的getter,但不應該直接這樣做。您添加視圖控制器的'UINavigationController'將在某個時刻調用該getter,以便將控制器的視圖添加到視圖層次結構中。你能分享你的視圖控制器實現嗎?這聽起來像你還有其他事情正在發生。 – Jonah

+0

它基本上是Xcode中的空UIViewController模板,但除init之外,沒有(視圖)方法被調用。在那裏我試圖建立一個這樣的視圖: - (id)init {self}(self = [super init]){ \t UIView * view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds] ]。 \t self.view = view; \t [查看新聞]; \t} return self; } –

2

也許你沒有面對這個問題......但有一天,我遇到了同樣惱人的麻煩.. loadView,viewDidLoad和viewWillAppear沒有在我的UIViewController中調用。

我的問題是簡單,但有點棘手,如果你不是很小心。而不是寫

-(void) loadView 

的我寫道:

-(void) loadview 

請注意,這將不會觸發任何警報。 loadView中的「V」和「v」的差別很容易被忽略。顯然,由於loadView沒有被調用,所以viewDidLoad/viewWillAppear不會被調用,因爲沒有視圖被加載(我沒有使用任何nib ...以編程方式創建視圖)。

-Anshu

2

另一種疑難雜症值得一提的是,如果你定義一個

@synthesize view; 

,而無需在實現匹配@property,這可能會導致調用您的視圖控制器的返回nil,並沒有通話到你的loadView方法。

+1

啊哈!這一個得到了我。由於過度的查找/替換操作,我最終在類中出現了「@synthesize視圖」,但沒有意識到這一點,突然間我的視圖完全變爲空白,因爲loadView再也沒有被調用過。追蹤這很困難。謝謝! –

相關問題