22

Ich habe einen UITabBarController im Storyboard eingerichtet. Ich möchte ein Wörterbuch von Daten aus dem Tab-Leiste-Controller für die Verwendung in der entsprechenden untergeordneten Registerkarte übergeben, die ein Standard UIViewController ist.Wie übermittele ich Daten von einem Tab-Controller zu einem seiner Tabs?

Dies scheint wie eine lange Fragen zu beantworten, aber ich weiß wirklich nicht, wo ich anfangen soll. Ich suche den einfachsten Weg dahin. Muss ich die Registerkarten programmgesteuert machen? Es würde mich sehr freuen, wenn ich auf eine nützliche Entwicklerdokumentation hinweise.

-Austin
p.s. Ich bin neu und bisher abhängig von Storyboard für Viewcontroller Übergänge

+0

Ich habe Probleme, das Parsen. Wie speichern Sie Daten in einem UITabBarController? Untergliedern Sie UITabBarController? Der Tab-Bar-Controller ist eigentlich nur ein Meta-Controller, mit dem View-Controller gesteuert werden. In Apples MVC-Framework sollten Ansichtscontroller verwendet werden, um Modelldaten an Ansichten zu binden. Wenn Sie Daten auf komplexe Weise zwischen View-Controllern austauschen müssen, können Sie Benachrichtigungen verwenden, ein Singleton erstellen, die Daten in einem Anwendungsdelegaten speichern oder einen freigegebenen externen Speicher wie CoreData verwenden. –

+0

Jeff, also sei genau, ich gebe die Daten an den UITabBarController, aber ich verstehe nicht, wie die Daten auf die separaten Registerkarten-Controller – austin

Antwort

19

Es dauerte ein paar Tage, aber ich entdeckte eine einfache Lösung. In meinem TabBarController der viewDidLoad Methode, kann ich auf und Attribute meines die Tabbed Subviews gesetzt

[[self viewControllers] objectAtIndex:0] 

oder was auch immer Index Sie zugreifen möchten verwenden.

Das Speichern als eine Instanz von meinem tab1_viewController gibt mir einen Zeiger auf das Objekt, aus dem ich meine Eigenschaftswerte abrufen und festlegen kann. Dies war zunächst unklar, da das Storyboard die tab_viewController-Objekte für mich erstellte. Ich hatte nie eine Chance, sie so zu initialisieren, wie ich es wollte!

+2

[Self.viewVontrollers FirstObject] ist sicherer. – Adobels

+0

Von einer einfacheren Lösung hätte man nicht träumen können. Gold!! Dies umfasst die Lösung und mögliche Probleme mit mehr als 5 Registerkarten. http://makeapppie.com/2015/02/04/swift-swift-tutorials-passing-data-in-tab-bar-controllers/ – DogCoffee

3

Ihre beste Wette ist es, Benachrichtigungen zu verwenden.

In der Tab-Leiste, würden Sie dies tun:

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

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

Dann in Ihrem Kind Registerkarte Viewcontroller, würden Sie "hören" für diese Meldung.

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

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

verteilt werden, ich habe Probleme, dies zum Funktionieren zu bringen. Ich habe versucht, den TabBarController-Code in seiner ViewDidLoad und in seinem TabBarController: didSelectViewController, kein Erfolg in beiden. Ich legte den Kind-Code in seiner AnsichtDidLoad – austin

0

erhielt diese Arbeits ...

Ich habe 3-View-Controller, muss ich von einem zum anderen das Array übergeben ..

Hier ist, was ich tat

einem die Daten Anfügen view-Controller von Tab

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

Und danach, die view-Controller geladen werden, das ist es

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

Wenn Sie eine UINavigationController als eine Ihrer UITabBarController View-Controller haben, können Sie wie folgt vorgehen:

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

Mit Swift

Wenn Sie UINavigationController als eine der Registerkarten in UITabBarController haben , möchten Sie die Instanz des Child-View-Controllers abrufen, anstatt eine neue Instanz zu erstellen, und sie vor dem Ändern des Registerkartenindexes in den Navigationsansicht-Controller übertragen. Sie können dies tun ...

Dieser Beispielcode setzt voraus, dass sich der Navigationscontroller auf der ersten Registerkarte (Index 0) befindet und "childViewController" in den Navigationscontroller eingebettet ist.

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

Mit Swift:

if let navController = self.tabBarController?.viewControllers?[1] as? UINavigationController{ 
     if let testController = navController.childViewControllers.first as? MyViewController{ 
      testController.data = data 
      self.tabBarController?.selectedIndex = 1 
     } 
} 
Verwandte Themen