在我的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:動畫:]謝謝!
該文檔指出您可以直接設置屬性,但不會有動畫。通常情況下,我發現這些屬性設置爲只讀,當您無意直接點擊它們來實現更改時。 – Bogatyr 2011-03-17 08:42:46
糟糕,其實,我認爲你是對的,在文檔方面。一個普通的舊UIToolBar的items屬性可以直接修改,但這是UINavigationController的特殊內置工具欄。不幸的是,在根視圖控制器的viewDidLoad例程中調用setToolbarItems:animated:也是行不通的。 – Bogatyr 2011-03-17 08:53:18
是的,這是我的想法,但這只是一個猜測。我從頂視圖控制器的viewDidDisappear方法中訪問導航控制器的工具欄時曾遇到過類似的問題。我通過不調用self.navigationController來克服它,而是訪問存儲在我的應用程序委託中的導航控制器的外部引用。但是,這可能與您的情況無關,但我仍會試試。 – hennes 2011-03-17 09:05:29