segue: destination-vue-contrôleur étrangeté

Dans mon application, j'utilise une table de montage séquentiel et enchaîne, et j'ai souvent passer des données à la vue de destination du contrôleur avant de faire la transition, comme suit:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{
    if ([segue.destinationViewController respondsToSelector:@selector(setMyData:)]) {
        [segue.destinationViewController performSelector:@selector(setMyData:) 
                                          withObject:myData];
    }
} 

Il fonctionne partout sauf dans un seul endroit. Le sélecteur est appelée, les données sont ensemble, mais quand la séquence est terminée et que le contrôleur de destination s'affiche, il n'a pas les données que je viens de définir. Après l'impression de la vue du contrôleur id à la fois la source et la destination des contrôleurs de vue, je trouve que le segue.destinationViewController dans le code ci-dessus est un autre exemple de la vue-contrôleur que celui qui est affiché. Ce qui se passe ici?

[JOUR 1]
J'ai regardé dans le cycle de vie de la destination-vue-contrôleur, et il obtient d'abord chargé au cours de la séquence d'exécution, mais APRÈS j'ai mis la propriété sur elle! Cela signifie, que lorsque j'appelle performSelector sur elle, la vue de l'objet contrôleur n'est pas initialisé! C'est pourquoi les données que j'ai mis ne colle pas. t ne comprends pas pourquoi est-ce le cas, et pourquoi ce même approche fonctionne dans les autres parties de mon application.

[Mise à JOUR 2]
L'affichage du code de setMyData par demande. Au début, je ne comprenais pas cette méthode, car locationToOpen est une propriété publique. J'ai seulement ajouté pour s'assurer qu'il est appelé à la et pour imprimer les informations de débogage.

- (void)setMyData:(MyData *)myData
{
    DLog(@"self: %@", (id)self);
    _myData = myData;
}
Est le destinationViewController un UINavigationController?
c'est un UIViewController qui est incorporé dans un UINavigationController. La séquence dans la bi va droit au UIViewController.
Êtes-vous sûr qu'il ne va pas à la manette de navigation? Essayez d'utiliser des [[segue.destinationViewController viewControllers] objectAtIndex:0]
Voulez-vous dire [[ ( (UIViewController *)segue.destinationViewController).navigationController viewControllers] objectAtIndex:0] ? Elle renvoie null. BTW, je ne pense pas qu'il est même possible d'enchaîner à un UINavigationController. Je reçois une erreur d'exécution lorsque je le fais.
Oui, il est possible d'enchaîner à un UINavigationController avec un UIViewController intégré. J'ai eu un problème similaire et remplacé segue.destinationViewController avec [[[segue destinationViewController] viewControllers] objectAtIndex:0] et il a bien fonctionné.

OriginalL'auteur Macondo2Seattle | 2012-06-02