2009-05-23 22 views
1

當我需要以編程方式加載一個觀點我執行以下操作:誰應該在程序加載的視圖上調用viewDidLoad?

MyController* myController = [[MyController alloc] init]; 
[[NSBundle mainBundle] loadNibNamed:@"myNib" owner:myController options:nil]; 
// use my controller here, eg. push it in the nav controller 

這工作得很好,但我的控制器的viewDidLoad不會被調用。所以我採取了loadNibNamed調用後手動調用它,但它似乎不正確。我期待框架以我的名義調用viewDidLoad。這是正確的方式還是我錯過了什麼?

回答

3

您應該加載視圖控制器與

MyController* myController = [[MyController alloc] initWithNibName:@"myNib" bundle:nil]; 

確保您MyController從UIViewController的延伸,View屬性界面生成器設置正確。

1

視圖被UIViewController懶惰地加載。如果您在代碼中使用訪問器myController.view,則應加載視圖並調用viewDidLoad

+1

不,這似乎是這種情況無論是。加載的視圖顯示正常,但viewDidLoad永遠不會被調用。我可以在從筆尖加載的「普通」控制器上的viewDidLoad中由[UIViewController的視圖]稱爲調試器堆棧看到,但似乎並不適用於控制器的製成手'。 – 2009-05-24 05:53:48

0

我注意到了同樣的事情。我認爲ViewDidLoad必須由視圖CONTROLLER調用。由於您的筆尖中沒有視圖控制器,因此您必須手動調用viewdidload。我需要做同樣的事情

5

我是Stack Overflow的新手,但是我發現了這個問題,並且發現了一些其他方法來加載一個確保viewDidLoad方法自動調用的nib文件。是正確的,但它需要你去ViewController的代碼之外來加載nib文件,這裏我提供的這兩個例子允許你將代碼保存在ViewController的實現中,不一定是更好的方法,只是不同而已。以做這種方式,請讓我知道你的想法

首先,initWithNibName內:包:你的UIViewController子類的方法,可以取代電話:
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

像這樣的東西:
self = [super initWithNibName:@"NameOfAlternateNibFile" bundle:nibBundleOrNil];

或者,你可以做到這似乎由以下做同樣的事情:

[[NSBundle mainBundle] loadNibNamed:@"NameOfAlternateNibFile" owner:self options:nil]; 
[self setView:self.view]; //this line ensures that the viewDidLoad method is called 

的關鍵是瞭解什麼是寫在UIViewController.h文件中的函數定義$initWithNibName:bundle:上方的註釋(在我的答案的底部包含,請參見斜體)。

使用這兩種方法之一做這件事的好處是viewDidLoad在任何一種情況下都會被調用。

以下是UIViewController.h列出的指令:

指定初始化。如果你的 子類UIViewController,你必須調用這個 方法的超級實現,即使你沒有使用 NIB。 (爲了方便,默認的 init方法將爲您執行此操作,並且 爲這兩個方法 參數指定nil。)在指定的NIB時, 文件的所有者代理應該有 類設置爲您的視圖控制器 子類,它連接到主視圖的視圖出口 。如果 調用此方法的名稱爲nil ,那麼此類的'-loadView 方法將嘗試加載名稱與您的視圖 控制器類相同的NIB 。如果沒有這樣的NIB在 事實存在,那麼您必須 電話-setView:前 - 視圖是 調用,或重寫-loadView方法以編程方式設置你的觀點。 - (ID)initWithNibName:(的NSString *)nibNameOrNil束:(一個NSBundle *)nibBundleOrNil;

相關問題