2009-05-27 46 views
27

作爲Cocoa新手,我遇到了幾個與Interface BuilderUIViewController和朋友有關的問題。UIViewController -viewDidLoad未被調用

我有一個UIViewController子類,在xib中定義了UIView,並且控制器的視圖插座連接到視圖。 xib的「文件所有者」設置爲myViewcontroller的子類。

在這種一個實例中,如所預期下面的代碼來加載控制器/視圖(從主視圖控制器)不工作:

if (self.myViewController == nil) 
{ 
    self.myViewController = [[MyViewController alloc] 
     initWithNibName:@"MyViewController" bundle:nil]; 
} 

[self.navigationController 
    pushViewController:self.myViewController animated:YES]; 

在MyViewController的方法中,我已放置斷點和日誌消息看看是怎麼回事:

-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 

    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { 
     NSLog(@"initWithNibName\n"); 
    } 

    return self; 
} 

-(void)viewDidLoad { 

    [super viewDidLoad]; 
    NSLog(@"viewDidLoad\n"); 
} 

預期結果

兩個調用和-viewDidLoad方法,並顯示myViewController的視圖。

把觀察結果

只有-initWithNibName被調用時,不顯示視圖。

我錯過了什麼嗎?任何人都可以推薦任何檢查? (特別是在極其不透明的Interface Builder工具中)。

+0

相關問題:http://stackoverflow.com/questions/1479576/viewdidload-not-called-in-subclassed-uiviewcontroller – Casebash 2011-04-18 02:53:14

+4

你有問題的朋友嗎? – Marty 2012-04-14 23:59:19

回答

12

好的,我有一個部分答案 - 也許大師可以解釋一些。問題是:

[self.navigationController pushViewController:myViewController animated:YES]; 

仔細看,在這種情況下self.navigationController爲零 - 這樣的推送消息會沒有地方。

相反,如果我送:

[self.view addSubview:self.myViewController.view]; 

,那麼該觀點似乎和-viewDidLoad被調用。

我不完全知道爲什麼self.navigationController沒有在這種情況下設置 - 我能想到的唯一的事情就是selfUIViewController而非UITableViewController(其中pushViewController代碼的來源)的子類。

此外,默默地允許消息去零似乎是一個壞主意,但these answers否則說。另見我的問題here

最後編輯:

答案在下面的評論,我已經意識到我其實後(給myViewController是模態)的顯示功能:

[self presentModalViewController:myViewController animated:YES]; 

感謝大家的有益響應。

4

確保在文件的所有者(你的viewController子類)認爲出口連接到實際的視圖(即480X320的畫布您在屏幕,你用它來創建用戶界面上看到的)

+0

是啊,謝謝,這當然是這種情況 - 我在上面提到過,但只是重複檢查。 – Justicle 2009-05-27 02:18:11

4

它看起來像一個資本化問題給我。您在調用pushViewController時引用類MyViewController而不是屬性myViewController

+0

我的糟糕的是,只是一個錯字,而移動代碼到stackoverflow - 我現在正在解決這個問題。謝謝。 – Justicle 2009-05-27 02:33:30

2

檢查您的運行日誌中是否有錯誤。幾乎可以肯定的是,NIB沒有加載,並且應該有這樣的錯誤。最可能的原因是未能將其放入捆綁包中。查看您的「複製資源」構建階段,並確保XIB實際上正在被複制。爲模擬器構建,然後進入構建目錄,並確保NIB位於.app包中。

+0

所有優點,CompileXIB被調用,並且MyViewController都處於「複製資源」階段並出現在應用程序包中。用乾淨的版本檢查了幾次。 另外我修改了-initWithNibName NSLog來寫'self',結果是:「initWithNibName self = 」,所以它看起來像被加載。 – Justicle 2009-05-27 03:24:17

+1

initWithNibName:bundle:不加載NIB。第一次調用-view加載NIB(所以檢查自己沒有證明任何東西)。檢查self.naviagationController不是零。如果是這樣,那麼你永遠不會實際加載NIB。此外,你可能會泄漏到你的作業self.myViewController(假設它是一個「保留」屬性,它應該是)。你需要autorelease它。雖然,在那裏使用訪問者的榮譽。在可可,當「沒有任何事情發生」時,事情就是零。最常見的情況是你沒有用IB連接它。 – 2009-05-27 03:51:43

+0

啊,感謝羅布,沒有看到你的評論 - 問題是,事實上,self.navigationController是零。不知道爲什麼(請參閱下面的答案)。 – Justicle 2009-05-27 06:10:04

8

解決方案發現!!!!!

即使是一件無害的事情,因爲這會導致發生方法調用viewDidLoad

插入此右頁頭後initWithNibName

viewController.view.hidden = NO; //calls viewDidLoad 
26

RE:發現的解決方案!!!!!

事實上,這似乎是一個工作的解決方案,但真正的訣竅不在於將view.hidden屬性設置爲NO,從nib文件加載視圖的方式是調用視圖方法,只能實際獲取視圖當第一次調用view方法時從nib加載。

從這個意義上說,簡單的[viewController view]消息將強制視圖從nib文件加載。

5

只需使用

- (void)viewDidAppear:(BOOL)animated{ 
     [super viewDidAppear:animated]; 
     //Your Code here 
    } 

代替viewDidLoad方法的。

1

另一個原因,回想起來有些明顯:如果在代碼中設置了viewController.view,那麼viewDidLoad事件將不會觸發。

5

很可能您沒有將中的ViewController,main.storyboard與您創建的自定義class相鏈接。您可能能夠通過segse從其他視圖控制器導航到該控制器,但viewDidLoad(),viewWillAppear()等中的任何一個都不會執行。

相關問題