Donc, je pousse un contrôleur de vue de RootViewController comme:
[self.navigationController pushViewController: anotherViewController animé: OUI];
MAIS, À PARTIR de anotherViewController
maintenant, je veux accéder à nouveau au RootViewController.
j'essaie
// (à l'intérieur d'un autreViewController maintenant) /// RootViewController * root = (RootViewController *) self.parentViewController; // Non. // err RootViewController * root = (RootViewController *) [self.navigationController.viewControllers objectAtIndex: 0]; // OUI!! Ça marche
Je ne sais pas pourquoi cela fonctionne et je ne suis pas sûr que ce soit la meilleure façon de le faire. Quelqu'un peut-il commenter une meilleure façon d'obtenir le RootViewController d'un contrôleur que vous avez poussé dans le navigationController de ce RootViewController et si la façon dont je l'ai fait est fiable ou non?
ios
iphone
uinavigationcontroller
bobobobo
la source
la source
Réponses:
Utilisez la propriété viewControllers de UINavigationController. Exemple de code:
C'est la manière standard d'obtenir le contrôleur de vue «arrière». La raison
objectAtIndex:0
fonctionne parce que le contrôleur de vue auquel vous essayez d'accéder est également le contrôleur racine, si vous étiez plus profond dans la navigation, la vue arrière ne serait pas la même que la vue racine.la source
rootViewController
est manquant*
avant lui, et l'index devrait simplement l'être0
. Le code de la question est correct:RootViewController *root = (RootViewController *)[navigationController.viewControllers objectAtIndex:0]
Version Swift:
Version ObjectiveC:
Où self est une instance d'un UIViewController incorporé dans un UINavigationController.
la source
Une version légèrement moins moche de la même chose mentionnée dans à peu près toutes ces réponses:
dans votre cas, je ferais probablement quelque chose comme:
dans votre sous - classe UINavigationController :
alors vous pouvez utiliser:
Éditer
OP a demandé une propriété dans les commentaires.
si vous le souhaitez, vous pouvez y accéder via quelque chose comme
self.navigationController.rootViewController
en ajoutant simplement une propriété en lecture seule à votre en-tête:la source
Pour tous ceux qui sont intéressés par une extension rapide, voici ce que j'utilise maintenant:
la source
En complément de la réponse de @ dulgan , c'est toujours une bonne approche à utiliser
firstObject
overobjectAtIndex:0
, car alors que le premier renvoie nil s'il n'y a pas d'objet dans le tableau, le dernier lève une exception.Sinon, ce serait un gros plus pour vous de créer une catégorie nommée
UINavigationController+Additions
et de définir votre méthode dans celle-ci.la source
Que diriez-vous de demander au singleton UIApplication pour sa keyWindow , et à partir de cette UIWindow, demandez le contrôleur de vue racine (sa propriété rootViewController ):
la source
Ici, j'ai trouvé une méthode universelle pour naviguer de n'importe quel endroit à root.
Vous créez un nouveau fichier de classe avec cette classe, afin qu'il soit accessible de n'importe où dans votre projet:
Utilisation depuis n'importe où dans votre projet:
la source
Cela a fonctionné pour moi:
Lorsque mon contrôleur de vue racine est intégré dans un contrôleur de navigation:
N'oubliez pas que
keyWindow
c'est obsolète.la source