2013-11-04 10 views
34

Ich bekomme einen Absturz beim Versuch, eine Eigenschaft in meinem Segment festzulegen. Es ist ein UIView, der eine Eigenschaft an einen Navigations-Controller übergibt, der eine TableView als Root-Ansicht besitzt. Es soll zu meinem TableViewController gehen, aber es sieht so aus, als ob es von diesem NavigationController abgefangen wird und einen unerkannten Selektorfehler auslöst.Festlegen einer Eigenschaft in einem Segment mit dem Navigationscontroller, der eine andere Ansicht enthält

Segue:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"showItems"]) { 
     ShowItemsTableViewController *destinationViewController = [segue destinationViewController]; 

     [destinationViewController setItems:[self itemsFromCoreData]]; 
    } 
} 

Fehler:

-[UINavigationController setItems:]: unrecognized selector sent to instance 0x10920c840

Was ist hier los? Dem NavigationController ist keine Klasse zugeordnet, er befindet sich nur im Storyboard und kommt modal auf. Es funktioniert, wenn ich das Segment im Storyboard so eingestellt habe, dass es direkt zur Ansicht geht, nicht zum NavigationController, aber ich brauche dort wirklich das Nav. Wie komme ich hier zurecht?

Antwort

73

Da das Ziel-View-Controller ist eigentlich die Navigationssteuerung, versuchen Sie die Root-Ansicht Zugriff auf etwa so:

UINavigationController *navController = [segue destinationViewController]; 
ShowItemsTableViewController *SITViewController = (ShowItemsTableViewController *)([navController viewControllers][0]); 
[SITViewController setItems:[self itemsFromCoreData]]; 
+1

Ich vermute, das wäre ähnlich für einen Tab-Controller als auch? Danke für die Hilfe. –

+0

Ich sehe, dass manchmal Leute die richtige VC bekommen und manchmal nicht. Sehr komisch. Gibt es irgendwo eine Art von Config, die der Anwendung sagt, dass sie den finalen Ziel-View-Controller bekommen soll? – mikebz

+1

Sie können auch [navController topViewController] – Iwaz

0

Betrachten Sie die View-Controller-Klasse in der Vorbereitung für den Übergang - es ist der Nav-Controller. Wirf es in diese Klasse, dann kannst du zu der gewünschten Ansicht gelangen, indem du sie nach ihrem Top-View-Controller fragst.

7

die topViewController aus dem UINavigationController Get:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if ([[segue identifier] isEqualToString:@"showItems"]) { 
     UINavigationController *navigationController = segue.destinationViewController; 
     ShowItemsTableViewController *showItemsTVC = (ShowItemsTableViewController *)navigationController.topViewController; 
     showItemsTVC.items = [self itemsFromCoreData]; 
    } 
} 
6

Für Swift:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "segueShowNavigation" { 
     var DestViewController = segue.destinationViewController as! UINavigationController 
     let targetController = DestViewController.topViewController as! ReceiveViewController 
    } 
} 
Verwandte Themen