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;
}
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
Vous devez vous connecter pour publier un commentaire.
Je le ferais comme suit -
Et dans le DestinationViewController.h, vous devez créer un bien -
Et aussi, assurez-vous de faire la synthèse de la propriété myData dans DestinationViewController.m -
OriginalL'auteur Das
J'ai eu ce même problème. Il s'est avéré que pour moi, la cible ViewController bien j'ai été la mise dans ma prepareForSegue: code a été déclaré comme étant de faible parce que j'avais copié et collé le bien de l'un que InterfaceBuilder auto-créé, mais la mienne n'était pas un objet Storyboard. Donc, mon bien a été libéré et remis à zéro par l'ARC sur la sortie de prepareForSegue:. En faisant un non-faiblesse de la propriété fixe.
OriginalL'auteur Ben
J'ai eu un problème similaire où le ViewController je faisais la séquence de changé à certains impair point,
après en cherchant un peu, il semble que la transition a créé un nouveau ViewController.
Pour résoudre la transmission de données problème que j'ai utilisé des notifications.
OriginalL'auteur m1sk
Je sais que ce fil est vieux et la solution doit être trouvée. Mais depuis que la solution finale n'est pas posté ici, je voudrais faire la liste de la cause possible (ce qui est la seule dans mon cas). J'ai eu le même problème, en essayant de définir la variable dans la vue de destination du contrôleur de la séquence. La cause est que j'ai oublié de instancié ([[Catégorie alloc]init]) la variable objet. J'en ai besoin dans mon cas parce que je suis en définissant les propriétés de l'objet au lieu de pointer vers un autre objet. Espérons que cette aide.
OriginalL'auteur emersonku