2011-03-17 53 views
1

在我的iOS應用程序我創建和模態呈現一個UINavigationController像這樣:呈現UINavigationController的模態 - 問題建立在根視圖控制器的viewDidLoad工具和導航欄項目

MyViewController *myvc = [[[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil] autorelease]; 
UINavigationController *navVC = [[[UINavigationController alloc] initWithRootViewController:myvc] autorelease]; 
[self presentModalViewController:navVC animated:YES]; 

在MyViewController viewDidLoad中我」米創建和設置工具欄項目的導航控制器的工具欄,就像這樣:

self.navigationController.toolbar.items = [NSArray arrayWithObjects:(items...), nil]; 

我遇到的問題是,項目沒有顯示出來。相反,如果我從MyViewController的viewDidLoad方法中調用一個方法,該方法通過performSelector:withObject:afterDelay:0添加工具欄項,那麼它完美地工作。所以顯然有一些競爭情況發生在UINavigationController的初始顯示,其工具欄/導航欄的初始化以及導航欄指定的初始根視圖控制器的初始化。

我在調試器中驗證了在UINavigationController的viewDidLoad方法之後調用了根視圖控制器的viewDidLoad。事實上,在調用presentModalViewController:之前,不會調用根視圖控制器的viewDidLoad方法,並且在initWithRootViewController中調用UINavigationController的viewDidLoad,所以並不意味着UINavigationController對象應該「全部準備就緒」,包括其導航欄和工具欄?

我原本以爲導航控制器的工具欄對象在MyViewController的viewDidLoad時間可能還不存在,但它顯然確實如此。至少,NSLog在MyViewController的viewDidLoad方法中顯示它不是零。事實上,UINavigationController的工具欄對象在兩種情況下都是相同的:在根視圖控制器的viewDidLoad中,以及我用performSelector:withObject:afterDelay調用的「setupToolbar」方法中,所以它不會以某種方式獲得「重新初始化」。

那麼,這是怎麼回事?爲什麼在MyViewController的viewDidLoad中我的工具欄修改不能「粘住」,爲什麼在runloop的下一個迭代中執行它們(performSelector:withObject:afterDelay:0)會使它工作?

什麼是在UINavigationController的rootViewController代碼中設置初始導航欄/工具欄項目的「正確」方法?我發現「發生了什麼」,儘管我仍然不明白「爲什麼」:在MyViewController的viewDidLoad方法返回後(我已經驗證導航控制器的工具欄的items數組是非零)之後,並且在下一次runloop迭代之前或之後(或者調用了performSelector:withObject:afterDelay:0時),導航控制器工具欄的items屬性設置爲nil!

編輯:同樣的問題時調用[self.navigationController setToolbarItems:動畫:]

編輯:解決,以正確的方式[自setToolbarItems:動畫:],而不是[self.navigationController setToolbarItems:動畫:]謝謝!

回答

2

只是猜測這裏,但你有沒有嘗試使用

[self setToolbarItems:[NSArray arrayWithObjects:(items...), nil] animated:NO]; 

從MyViewController的viewDidLoad方法中?我不確定它是否是像你一樣直接訪問導航控制器工具欄的正確方法。至少API指出

UIViewController類參考

...

- (void)setToolbarItems:(NSArray *)toolbarItems animated:(BOOL)animated 

...

查看由導航控制器管理控制器可以使用此方法爲導航控制器的內置工具欄指定工具欄項目。您可以在顯示視圖控制器之前或在其已經可見之後,爲視圖控制器設置工具欄項目。

+0

該文檔指出您可以直接設置屬性,但不會有動畫。通常情況下,我發現這些屬性設置爲只讀,當您無意直接點擊它們來實現更改時。 – Bogatyr 2011-03-17 08:42:46

+0

糟糕,其實,我認爲你是對的,在文檔方面。一個普通的舊UIToolBar的items屬性可以直接修改,但這是UINavigationController的特殊內置工具欄。不幸的是,在根視圖控制器的viewDidLoad例程中調用setToolbarItems:animated:也是行不通的。 – Bogatyr 2011-03-17 08:53:18

+0

是的,這是我的想法,但這只是一個猜測。我從頂視圖控制器的viewDidDisappear方法中訪問導航控制器的工具欄時曾遇到過類似的問題。我通過不調用self.navigationController來克服它,而是訪問存儲在我的應用程序委託中的導航控制器的外部引用。但是,這可能與您的情況無關,但我仍會試試。 – hennes 2011-03-17 09:05:29

相關問題