2012-11-09 42 views
0

我有一個應用程序,從AppDelegate創建一個tabbarcontroller。我想要一個按鈕添加到導航欄,但無法。最終我設法得到了一些有效的代碼,但我並不真正瞭解它。爲什麼重寫navigationController:willShowViewController:動畫必要的標籤欄

的步驟是:

  1. 確認的AppDelegate中以UINavigationControllerDelegate
  2. 設置rootNavigationController.delegate =自
  3. 覆蓋navigationController:willShowViewController:動畫和tabBarController:didSelectViewController

我想我遵循tabBarController:didSelectViewController代碼,但我迷失在與發生了什麼navigationController:willShowViewController:動畫

- (void) tabBarController: (UITabBarController*) tabBarController didSelectViewController: (UIViewController*) viewController 
{ 
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) 
    { 
    self.tabBarController.navigationItem.title = viewController.navigationItem.title; 
    self.tabBarController.navigationItem.rightBarButtonItems = viewController.navigationItem.rightBarButtonItems; 
    self.tabBarController.navigationItem.leftBarButtonItems = viewController.navigationItem.leftBarButtonItems; 
    } 
    } 



- (void) navigationController: (UINavigationController*) navigationController 
    willShowViewController: (UIViewController*) viewController 
       animated: (BOOL) animated 
    { 
     if (viewController == tabBarController) 
     { 
     UIViewController* tabViewController = tabBarController.selectedViewController; 
    SEL willShowSel = @selector(navigationController:willShowViewController:animated:); 

     if ([tabViewController respondsToSelector: willShowSel]) 
     { 
     UIViewController<UINavigationControllerDelegate>* vc = 
      (UIViewController<UINavigationControllerDelegate>*) tabViewController; 
     [vc navigationController: navigationController willShowViewController: vc animated: animated]; 
     } 
    } 

回答

1

此代碼可能處理那些發生使用UITabBarController一個UINavigationController內的問題。 UITabBarController文檔指出它需要是根視圖控制器(即不在UINavigationController內)並以其他方式使用它可能會導致問題。

什麼碼似乎做的是捕獲正常傳遞到viewController事件,檢查如果是UITabBarController,如果是的話,它會檢查在UITabBarController可見視圖是否響應這種方法,如果確實如此然後它將方法(選擇器)調用傳遞給該視圖。

如果有可能,我建議將UITabBarController從嵌入UINavigationController中。可能需要一些工作,但會使你的代碼兼容。 (並刪除需要navigationController:willShowViewController:animated:

+0

感謝您的意見,我會認爲這是一個相當標準的設計 - 標籤欄是頂級和帶按鈕的導航欄 – ardochhigh

+0

我認爲它比這更簡單:意圖出現將按鈕添加到TBC的導航欄,但TBC沒有導航欄;只有子控制器可以。 –