web-dev-qa-db-fra.com

Définition d'une propriété dans une séquence avec le contrôleur de navigation contenant une autre vue

Je reçois un plantage lorsque j'essaie de définir une propriété dans ma séquence. Il s'agit d'une UIView transmettant une propriété à un contrôleur de navigation qui a une TableView comme vue racine. Il est censé aller à mon TableViewController, mais il semble qu'il soit intercepté par ce NavigationController et génère une erreur de sélecteur non reconnue.

Segue:

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

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

Erreur:

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

Que se passe t-il ici? Ce NavigationController n'a pas de classe associée, il est juste dans le storyboard et apparaît de manière modale. Cela fonctionne si je définis la séquence dans le storyboard pour aller directement à la vue, pas le NavigationController, mais j'ai vraiment besoin de la navigation là-bas. Comment puis-je contourner cela?

34
user2529626

Étant donné que le contrôleur de vue de destination est en fait le contrôleur de navigation, essayez d'accéder à la vue racine comme suit:

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

Pour Swift:

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

Obtenez le topViewController du UINavigationController:

- (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];
    }
}
7
Guto Araujo

Regardez la classe de contrôleur de vue dans la préparation de la séquence - c'est le contrôleur de navigation. Castez-le dans cette classe, puis vous pouvez accéder à la vue souhaitée en lui demandant son contrôleur de vue de dessus.

0
David H