2010-10-02 82 views
1

我有一個帶有兩個選項卡的選項卡欄的應用程序。一個選項卡顯示一個UINavigationController,另一個選項卡顯示我已經定製的UIViewController。UITabBarController和UINavigationController交互

我已經注意到的是,如果切換標籤到UINavigationController的選項卡,然後導航深UITableViews幾級,如果我點擊UITabBar的當前選項卡中的UINavigationController彈出到它的根視圖上。

我想知道這是如何發生的。它看起來並不是UINavigationController是UITabBar或UITabBarController的代理,這將是一個選項。該功能以某種方式自動進行。

我想在第二個選項卡上對我的UIView實施類似的操作,所以我想弄明白這一點。謝謝!

回答

2

UITabBarController正在做什麼是,只要您點擊一個已經選擇的選項卡,它會檢查該選項卡的UIViewController是否爲UINavigationController。如果是,則彈出到rootViewController。

你想要做的是設置你第二個選項卡的UITabBarController的委託,並檢查

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController 

當過該方法被觸發,檢查viewController是你的第二個選項卡的viewController,而且selectedIndex (的UITabBarController)爲1.如果是這種情況,請執行您的操作。

這隻適用於iOS 3.0或更高版本。在版本3.0之前的iOS版本中,只有在所選視圖控制器實際發生更改時才調用此方法。

+0

謝謝,最好我想要一個解決方案,我可以在另一個選項卡上使用 - 但我想我可以只設置一個委託給UITabBarController – 2010-10-02 23:01:49

+0

您可以將委託設置爲您的appDelegate對象。然後根據需要發送NSNotification或直接發送消息。 – gcamp 2010-10-03 14:13:36

1

這實際上是一個很好的問題,直到今天我從未注意到這種行爲。 我對此進行了快速猜測,經過一些測試後,我似乎是正確的:由於TabBarController知道,它的選項卡包含UINavigationController,因此它只是簡單調用NavigationController的popToRootViewControllerAnimated:方法。我通過創建一個類別來測試它,該類別覆蓋了popToRootViewControllerAnimated:方法(當然,您不應該在您的應用中執行該方法),並且實際上調用了此方法。 這會回答你關於「如何」的問題。如果一個人可以考慮在你的ViewController中重現這一點,我會告訴你。

+0

我已經嘗試打印出UIViewController的所有通知和respondsToSelector調用,並且在選項卡已被選中後單擊TabBar時沒有任何操作被調用。所以你是對的,它似乎是不同的行爲取決於它是否是一個UINavigationController – 2010-10-02 23:31:16

相關問題