2011-07-05 99 views
1

我正在使用委託爲我的應用程序存儲數據。我有一個帶有navigationviewcontroller作爲第一個視圖控制器的tabviewcontroller。當我設置代理使用委託= [[UIApplication sharedApplication]委託];在init中不起作用:只有viewDidLoad

delegate = [[UIApplication sharedApplication] delegate]; 

委託在init方法之外爲空。
但是,它在viewDidLoad中的位置時正常工作。任何想法,爲什麼這可能是?

UPDATE

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     delegate = [[UIApplication sharedApplication] delegate]; 
    } 
    return self; 
} 
+0

你重寫哪個初始化方法?被調用者取決於如何創建控制器。 – Caleb

+0

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 此外,它被調用,並且委託在init方法內部設置,但是如果我嘗試訪問init方法之外的委託(例如,在viewDidLoad中),那麼委託是空的 – James

+0

但它在init方法內工作嗎?它不是空嗎? – akashivskyy

回答

0

nib文件調用initWithCoder方法,而不是init。

0

,則不應使用-init方法。有時候沒有被調用。使用這些方法進行額外的初始化:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // do something 
} 

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    // do something 
} 
+4

你能證明這一點嗎?在其初始化方法中初始化視圖控制器沒有任何問題;只是控制器的視圖在那個時候沒有加載,所以依賴於視圖的初始化應該推遲到'-viewDidLoad'。 – Caleb

+0

是的,我知道它適用於使用viewDidLoad,但我不認爲這是最佳做法。此外,init在這種情況下被調用 – James

+0

好的,這是我以前沒有意識到的愚蠢,但是如果我設置全局測試字符串的值,我甚至不能在init之外訪問該值。非常奇怪的事情正在發生 – James

1

此視圖控制器在您的MainWindow.xib文件(或任何主要的.xib在您的項目被稱爲)?如果是這樣,應用程序委託很可能也會在加載該文件時創建,並且應用程序委託可能在您的視圖控制器創建時爲零。如果您的應用程序代理具有對此視圖控制器的引用,請將它自己設置爲-applicationDidFinishLoadin:withOptions:中的視圖控制器代理,或者將應用程序代理連接到.xib文件中的視圖控制器的-delegate插座。

+0

它不是MainWindow.xib。我創建了一個單獨的tabBarViewController類,其中有tabbar。對於這個特定的視圖控制器還有一個單獨的UIViewcontroller – James

+0

然而,如果在應用程序啓動時正在創建視圖控制器,那麼應​​用程序委託可能尚未設置。如果您在嘗試分配的行上中斷,是否真的獲得了應用程序委託的合法指針? – Caleb

+0

視圖控制器直到在它之前的登錄屏幕上按下按鈕纔會被創建。是的,在init方法中,我得到了一個指向委託的合法指針,我甚至可以訪問它的值。但是,在init方法結束後,我不能再訪問委託。 – James