Comment faire pour revenir à la racine de la vue-contrôleur, mais ensuite pousser à un point de vue différent?
Je suis en train d'écrire une application simple qui dispose de 3 contrôleurs de vue. La racine-vue-contrôleur est un item listing
, de la table de base de la vue. Hors de ce point de vue contrôleur, je pousse deux point de vue différent des contrôleurs basés sur une interaction utilisateur - un create item
- vue-contrôleur ou un view item
- vue-contrôleur.
Donc, le storyboard enchaîne suffit de regarder comme un V, ou quelque chose.
Sur mon create item
- vue-contrôleur, je tiens à revenir à la vue racine contrôleur lorsque l'utilisateur crée un nouvel élément, mais alors de pousser à l' view item
contrôleur afin que je puisse regarder le nouvellement créé élément.
Je n'arrive pas à obtenir que cela fonctionne. Il est assez facile de revenir à la racine-vue-contrôleur, mais je suis incapable de pousser que view item
contrôleur.
Des idées? Je l'ai collé mon code, ci-dessous. Le menu fonctionne, mais le nouveau point de vue n'apparaît jamais.
- (void) onSave:(id)sender {
CLLocation *currentLocation = [[LocationHelper sharedInstance] currentLocation];
//format the thread object dictionary
NSArray* location = @[ @(currentLocation.coordinate.latitude), @(currentLocation.coordinate.longitude) ];
NSDictionary* thread = @{ @"title": _titleField.text, @"text": _textField.text, @"author": @"mustached-bear", @"location": location };
//send the new thread to the api server
[[DerpHipsterAPIClient sharedClient] postPath:@"/api/thread"
parameters:thread
success:^(AFHTTPRequestOperation *operation, id responseObject) {
//init thread object
Thread *thread = [[Thread alloc] initWithDictionary:responseObject];
//init view thread controller
ThreadViewController *viewThreadController = [[ThreadViewController alloc] init];
viewThreadController.thread = thread;
[self.navigationController popToRootViewControllerAnimated:NO];
[self.navigationController pushViewController:viewThreadController animated:YES];
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
[self.navigationController popToRootViewControllerAnimated:YES];
}];
}
OriginalL'auteur Ryan | 2012-08-05
Vous devez vous connecter pour publier un commentaire.
Un moyen facile d'accomplir ce que vous voulez faire est de construire une logique simple dans votre principale vue de la racine de contrôleurs -(void)viewWillAppear méthode et l'utilisation d'un délégué de rappel pour inverser la logique de l'interrupteur. fondamentalement, une "référence" à la racine du contrôleur. voici un exemple rapide.
racine principale (contrôleur de considérer ce contrôleur a) - bien l'appeler controllerA
définir une propriété de garder une trace de la sauter statut
configuration d'un peu de logique dans
Maintenant, dans votre racine principale du contrôleur,lorsqu'un tableview ligne est sélectionnée faire quelque chose comme ceci
lorsque l'on pousse à controllerB dans votre tableView ne sélectionnez la méthode
puis de mettre en œuvre votre préparer pour enchaîner méthode
Maintenant passer à controllerB
vous devez définir une propriété appelée "délégué" pour tenir le dos de référence
et vous devez importer le fichier d'en-tête à partir de la racine contrôleur
puis juste avant de revenir pour controllerA, vous définissez l'indicateur
et c'est à son sujet. Vous n'avez pas à faire quoi que ce soit avec controllerC. Il existe d'autres façons de faire, mais c'est assez simple pour répondre à vos besoins. espérons que cela fonctionne pour vous.
create item
vue.Je suis content que les conseils vous allez dans une direction qui ont travaillé pour vous. bonne chance!
OriginalL'auteur CocoaEv
Si je vous comprends bien, vous avez une pile de vue des contrôleurs:
Et que vous souhaitez le devenir:
Droit? Dans ce cas:
Swift 4
^ @LysannSchlegel c'est le point. Il anime à partir de l'E->F, mais si vous touchez le bouton de retour, vous vous rendrez à Un à la place de E. Fondamentalement, l'effacement de l'arrière de la pile vers le bas de la vue parent sans funky/inattendu des animations dans les entre les!
Dave réponse est grand, prendre au prochain niveau de réutilisation avec une Catégorie sur UINavigationController: stackoverflow.com/a/25771209/1103584
Quelqu'un peut-il le faire dans Swift?
Pourquoi n'est-ce pas la accepté de répondre lol
OriginalL'auteur Dave DeLong
Je pense
[self.navigationController pushViewController:viewThreadController animated:YES];
un NavigationController de l'instruction avant que.
Car après avoir mis à la racine de la vue Contrôleur de vous lâche la manette de navigation vous êtes. Résoudre à l'aide de ce code au lieu
Je pense aussi que cette habitude de résoudre votre problème dans son entier. Vous obtiendrez probablement une erreur disant que deux rapide popping et en poussant peut invalider la NavigationController.
Et pour résoudre ce que vous pouvez pousser le NavigationController dans le viewDidDissappear Méthode de la 2e-Vue-Contrôleur ou la pousser dans le viewDidAppear Méthode dans la Vue Principale du Contrôleur(rubrique inscription).
Simplement à l'aide de popToRootController est la réponse ici, je crois. Pas besoin de faire quelque chose de drôle avec le viewController de la pile et la pousse peut fonctionner normal, comme d'habitude.
OriginalL'auteur M.C.
Le partage d'une catégorie sur UINavigationController basé sur Dave DeLong la réponse que nous utilisons dans notre application pour garder le bouton de retour, toujours en train de travailler en tant que de besoin.
OriginalL'auteur jlichti
OriginalL'auteur user5018497
Je ne pense pas que ce soit possible parce que popping dos va libérer tout.
Je pense que la meilleure voie est de mettre vos données sur un modèle de classe singleton, de la pop à la rootviewcontroller et d'écouter de la pop à la fin. Ensuite, vous vérifiez s'il ya quelques données stockées sur le modèle de sorte que vous savez si vous devez pousser une nouvelle viewcontroller.
OriginalL'auteur polyclick
J'ai utilisé de Dave réponse comme source d'inspiration et de fait cela pour Swift:
OriginalL'auteur Rutger Huijsmans
Si ce que vous voulez faire est de naviguer en quelque sorte à l'intérieur de la manette de navigation... vous pouvez accéder à la navigationStack A. K. A. viewControllers et puis définissez la viewcontrollers dans l'ordre que vous voulez, ou d'ajouter ou de supprimer certains...
C'est le plus propre et le natif façon de le faire.
faire toutes les validations nécessaires afin de ne pas faire exception à la règle.
OriginalL'auteur user2387149