22

我有一個在故事板中設置的UITabBarController。我想從標籤欄控制器傳遞一個數據字典,用於相應的子標籤頁,這是一個標準的UIViewController。如何將數據從標籤欄控制器傳遞到其標籤之一?

這似乎是一個很長的問題要回答,但我真的不知道從哪裏開始。我正在尋找通過這個最簡單的方法。我必須讓這些選項卡以編程方式工作嗎?指向我的任何有用的開發人員文檔也將不勝感激。

-Austin
p.s.我是新的,迄今爲止依賴於故事板的視圖控制器轉換

+0

我無法解析此。你如何在UITabBarController中存儲數據?你在繼承UITabBarController嗎?標籤欄控制器實際上只是一個用於控制視圖控制器的元控制器。在Apple的MVC框架中,應該使用視圖控制器將模型數據綁定到視圖。如果您需要以複雜的方式在視圖控制器之間共享數據,那麼您可以使用通知,創建單例,將數據存儲在應用程序委託中,或使用共享的外部存儲(如CoreData)。 –

+0

傑夫,所以具體而言,我將數據傳遞給UITabBarController,但我不明白如何將數據分發到單獨的選項卡式視圖控制器 – austin

回答

19

花了幾天時間,但我發現了一個簡單的解決方案。在我的TabBarController的viewDidLoad方法,我可以訪問和使用

[[self viewControllers] objectAtIndex:0] 

或任何索引要訪問我的設置選項卡式子視圖的屬性。

保存作爲我的tab1_viewController的一個實例給我一個指向對象的指針,從中我可以獲取並設置我的屬性值。這最初是不清楚的,因爲storyboard爲我創建了tab_viewController對象。我從來沒有機會按照我想要的方式初始化它們!

+2

[self.viewVontrollers firstObject]中更安全。 – Adobels

+0

想不到更簡單的解決方案。金!!這涵蓋了解決方案並討論了超過5個選項卡的可能問題。 http://makeapppie.com/2015/02/04/swift-swift-tutorials-passing-data-in-tab-bar-controllers/ – DogCoffee

3

你最好的選擇是使用通知。

在你的標籤欄,你可以這樣做:

NSDictionary *myDictionary; // Populate this with your data. 

// Fire the notification along with your NSDictionary object. 
[[NSNotificationCenter defaultCenter] postNotificationName:@"Some_Notification_Name" 
                object:myDictionary];   

然後在你的孩子標籤視圖控制器,你會「監聽」該通知。

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(handleNotification:) 
              name:@"Some_Notification_Name" 
              object:nil]; 

- (void)handleNotification:(id)object { 
    // Use your NSDictionary object here. 
} 
+0

我無法正常工作。我試着把tabBarController代碼放在它的viewDidLoad和tabBarController:didSelectViewController中,兩者都沒有成功。我把子代碼放在viewDidLoad – austin

0

得到這個工作...

我有3個視圖控制器,我必須將陣列從一個傳遞到另一個..

這裏是我做過什麼

數據追加到一個選項卡的視圖控制器

NSArray *viewControllers = [self.tabBarController viewControllers]; 
    ListViewController *listView = (ListViewController *)viewControllers[1]; 
    listView.myArray = self.myArray; 
    [self.tabBarController setSelectedIndex:1]; 

而在此之後,加載視圖控制器,這是它

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 
ListViewController *listView = (ListViewController *)[storyboard instantiateViewControllerWithIdentifier:@"IDListView"]; 
3

如果你有一個UINavigationController爲您UITabBarController視圖控制器之一,你可以做到以下幾點:

NSArray *viewControllers = [self.tabBarController viewControllers]; 
UINavigationController *myNavController = (UINavigationController *)viewControllers[2]; 
MyViewController *myController = [[myNavController childViewControllers] firstObject]; 
// Remember to alloc/init objects first if the objects haven't been initialized already. 
[myController.whateverArray = [[NSArray alloc] initWithArray:@[@"Example1", @"Example2"]]; 
[self.tabBarController setSelectedIndex:2]; 
2

使用斯威夫特

如果你有UINavigationControllerUITabBarController一個選項卡,您希望獲取子視圖控制器的實例,而不是創建新實例,並在更改選項卡視圖索引之前將其推送到導航視圖控制器。您可以這樣做...

此示例代碼假定導航控制器位於第一個選項卡(索引0),並且「childViewController」嵌入在導航控制器中。

let viewControllers = self.tabBarController?.viewControllers 

let navController = viewControllers![0] as! UINavigationController 

let profileViewController = self.storyboard?.instantiateViewControllerWithIdentifier("childViewController") as? ProfileViewController 

profileViewController!.parameter1 = "Value1" 

profileViewController!.parameter2 = "Value2" 

navController.pushViewController(profileViewController!, animated: true) 

self.tabBarController?.selectedIndex = 0 
1

隨着斯威夫特

if let navController = self.tabBarController?.viewControllers?[1] as? UINavigationController{ 
     if let testController = navController.childViewControllers.first as? MyViewController{ 
      testController.data = data 
      self.tabBarController?.selectedIndex = 1 
     } 
} 
相關問題