En bref: Comment puis-je PushViewController à partir de ViewController présenté?
En bref:
J'ai MainViewController
, dans lequel j'ai un bouton sur clic de bouton, je présente une vue appelée LoginViewController
.
Sur cette page (LoginViewController
), j'ai encore button
, en cliquant dessus, j'essaie de pousser mon contrôleur de vue (appelé HomeViewController
) qu'il ne pousse pas.
Voici mon extrait de code,
MainViewController.m
- (IBAction)LoginClicked:(id)sender {
LoginViewController *vc = [[LoginViewController alloc] init];
[self presentViewController:vc animated:YES completion:nil];
}
LoginViewController.m
- (IBAction)buttonActionMethodOnLoginView:(id)sender{
NSLog(@"viewControllers %@",APPDELEGATE.nav.viewControllers);
//LoginViewController is not in this array
HomeViewController *obj = [[HomeViewController alloc] init];
[self.navigationController pushViewController:obj animated:YES];
}
Mais cela n'a pas fonctionné pour moi. J'ai aussi imprimé a stack of view controllers
avant pushed
, mais il n'a pas LoginViewController
. Donc, sans ajouter LoginViewController
dans a stack of view controllers
, Comment puis-je pushed
à HomeViewController
à partir de LoginViewController
?
Quand je récupère de HomeViewController
, alors LoginViewController
devrait s'ouvrir ..
Est-il possible d'utiliser ce single NavigationController
?
Remarque: - Ici, je viens de prendre un exemple en utilisant Login, Home et Main ViewController. Mais je veux cela dans d'autres écrans.
Vous devez Push
depuis votre première vue (MainViewController
), mais vous pouvez utiliser une animation identique à PresentView
et DismissView
. Utilisez le code suivant pour cela: -
Pour Push (sur MainViewController
)
LoginViewController *VC = [[LoginViewController alloc]init];
CATransition* transition = [CATransition animation];
transition.duration = 0.3f;
transition.type = kCATransitionMoveIn;
transition.subtype = kCATransitionFromTop;
[self.navigationController.view.layer addAnimation:transition
forKey:kCATransition];
[[[UINavigationController alloc] initWithRootViewController:VC] pushViewController:VC animated:NO];
//[self.navigationController pushViewController:VC animated:NO];
Pour Pop (sur LoginViewController
)
CATransition* transition = [CATransition animation];
transition.duration = 0.3f;
transition.type = kCATransitionReveal;
transition.subtype = kCATransitionFromBottom;
[self.navigationController.view.layer addAnimation:transition
forKey:kCATransition];
[self.navigationController popViewControllerAnimated:NO];
En utilisant ce code, vous pouvez obtenir une animation identique à Present-Dismiss ViewControllers
. Reportez-vous cette réponse pour plus de détails.
Et après cela, vous pouvez utiliser votre code pour Pushing
LoginViewController
à HomeViewController
J'espère que c'est ce que vous recherchez. Toute inquiétude me revient. :)
salut quand vous présentez votre contrôleur de vue de connexion Présentez simplement un contrôleur de navigation comme:
LoginVC *loginVCObj =[[LoginVC alloc]initWithNibName:@"LoginVC" bundle:nil];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:loginVCObj];
[self presentViewController:nav animated:YES completion:nil];
Maintenant, votre PresentedViewController est un navigtioncontroller maintenant vous pouvez simplement pousser vers votre VC domestique
HomeViewController *obj = [[HomeViewController alloc] init];
[self.navigationController pushViewController:obj animated:YES];
J'espère que cela vous sera utile
LoginViewController
ne doit pas être poussé vers la pile du contrôleur de navigation. Permettez-moi de décrire ci-dessous "pourquoi".
Notre MainViewController
devrait être sur la pile - vous voulez toujours y retourner.
// AppDelegate.m (only if you don't use storyboards, if you do - you don't need to copy this part of code)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// create the window
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[self.window setBackgroundColor:[UIColor whiteColor]];
[self.window makeKeyAndVisible];
// set view controllers
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:[[MainViewController alloc] init]];
[self.window setRootViewController:navigationController];
}
Sur une action spécifique, affichez LoginViewController
. Vous ne voulez pas que l'utilisateur puisse appuyer sur back
et aller dans MainViewController
. Plus tard, vous ne voudrez pas que l'utilisateur revienne à LoginViewController
. Pour cette raison, vous devez le présenter comme modal:
// inside `MainViewController.m`
- (IBAction)myCoolActionToShowLogin:(id)sender {
[self presentViewController:[[LoginViewController alloc] init] animated:YES completion:nil];
}
Maintenant, nous pouvons voir LoginViewController
. Lorsque l'utilisateur termine la connexion, fermez-la et présentez HomeViewController
:
// inside `LoginViewController.m`
- (IBAction)myAwesomeActionToShowHome:(id)sender {
UINavigationController *navigationController = (UINavigationController *)[UIApplication.sharedApplication.keyWindow rootViewController];
[navigationController pushViewController:[[HomeViewController alloc] init] animated:YES];
[self dismissViewControllerAnimated:YES completion:nil];
}
REMARQUES:
Comme vous pouvez le remarquer, myAwesomeActionToShowHome:
attend que votre contrôleur de navigation soit votre rootViewController
. Cela fonctionne, mais devrait être plus agréable - vous devriez vérifier si cette navigation est en fait un contrôleur de navigation au lieu de la lancer. Ou vous pouvez créer un délégué ou un bloc pour en envoyer un nouveau. Il s'agit de la solution de travail la plus rapide et la plus simple, qui devrait être améliorée ultérieurement.
Vous devez vraiment lire: Apple Developer -> "View Controller Programming" documentation , car ce sont les principes fondamentaux que vous devez savoir pour développer et concevoir correctement l'UX.
Voici le fonctionnement exemple de démonstration .
Vous ne pouvez pas pousser à partir d'un contrôleur de vue présenté. Je vous suggère de conserver votre hiérarchie de navigation.
Pour cela, à partir de votre MainViewController, vous devez présenter LoginViewController et vous devez passer le contrôleur de navigation pour MainViewController.
- (IBAction)openLogin:(id)sender {
LoginViewController *loginVC = (LoginViewController *) [self.storyboard instantiateViewControllerWithIdentifier:@"login"];
[loginVC setReferencedNavigation:self.navigationController];
[self presentViewController:loginVC animated:YES completion:nil];
}
Ensuite, dans LoginViewController, vous devez pousser vers HomeViewController comme ceci,
LoginViewController.h
@interface LoginViewController : UIViewController {
UINavigationController *refNavigationController;
}
- (void) setReferencedNavigation:(UINavigationController *)refNavCon;
LoginViewController.m
- (void) setReferencedNavigation:(UINavigationController *)refNavCon {
refNavigationController = refNavCon;
}
- (IBAction)openHome:(id)sender {
[self dismissViewControllerAnimated:YES completion:^{
UIViewController *homeVC = [self.storyboard instantiateViewControllerWithIdentifier:@"home"];
[refNavigationController pushViewController:homeVC animated:YES];
}];
}
En faisant cela, cela ressemblera à, vous poussez depuis LoginViewController mais en réalité vous poussez depuis MainViewController.
Vous pouvez personnaliser cette approche pour maintenir l'animation et l'interface utilisateur de ce flux.
1) présenter un navigation controller with its
root view controller` défini comme contrôleur de vue.
- (IBAction)LoginClicked:(id)sender
{
LoginViewController *loginViewController = [LoginViewController alloc] init];
UINavigationController *navController = [UINavigationController alloc] initWithRootViewController:loginViewController];
[self presentViewController:navController animated:YES completion:nil];
}
- (IBAction)buttonActionMethodOnLoginView:(id)sender
{
HomeViewController *obj = [[HomeViewController alloc] init];
[self.navigationController pushViewController:obj animated:YES];
}
J'espère que cela fonctionnera pour vous.
Le problème est que LoginViewController
n'a pas de contrôleur de navigation. Ensuite, vous lui en donnez un.
Créez un UINavigationController
, mettez LoginViewController
dans la pile et présentez le UINavigationController
.
- (IBAction)LoginClicked:(id)sender {
LoginViewController *vc = [[LoginViewController alloc] init];
UINavigationController = nav = [[UINavigationController alloc] init];
nav.viewControllers = @[vc];
[self presentViewController:nav animated:YES completion:nil];
}
- (IBAction)buttonActionMethodOnLoginView:(id)sender{
HomeViewController *obj = [[HomeViewController alloc] init];
[self.navigationController pushViewController:obj animated:YES];
}
Appelez dismissViewControllerAnimated
dans votre MainViewController
.
Créer une instance UINavigationController
[[UINavigationController alloc] initWithRootViewController:[[LoginViewController alloc] init]]
Présentez ce navigationController puis appuyez sur ce que vous voulez VC.
MainViewController.m
- (IBAction)LoginClicked:(id)sender {
LoginViewController *vc = [[LoginViewController alloc] init];
UINavigationController *loginNav = [[UINavigationController alloc] initWithRootViewController:vc];
[self presentViewController:loginNav animated:YES completion:nil];
}
LoginViewController.m
- (IBAction)buttonActionMethodOnLoginView:(id)sender{
NSLog(@"viewControllers %@",APPDELEGATE.nav.viewControllers);
//LoginViewController is not in this array
HomeViewController *obj = [[HomeViewController alloc] init];
[self.navigationController pushViewController:obj animated:YES];
}
Il s'agit d'un code très simple pour le contrôleur de vue actuel et le contrôleur de vue Push.
- (IBAction)LoginClicked:(id)sender {
LoginViewController *objLogicVC = [LoginViewController alloc] init];
UINavigationController *navPresent = [UINavigationController alloc] initWithRootViewController:objLogicVC];
[self presentViewController:navPresent animated:YES completion:nil];
}
- (IBAction)buttonActionMethodOnLoginView:(id)sender{
HomeViewController *objHomeVC = [[HomeViewController alloc] init];
[self.navigationController pushViewController:objHomeVC animated:YES];
}
il suffit de mettre ce code dans Objectif C sur boutonaction
UIViewController *yourViewControllerName = [self.storyboard instantiateViewControllerWithIdentifier:@"yourViewControllerName "];
[[self navigationController] pushViewController:yourViewControllerName animated:YES];
Pour Swift 3.0
Présentez votre contrôleur de vue comme un nouveau rootViewController
let navController = UINavigationController.init(rootViewController: self.storyboard!.instantiateViewController(withIdentifier: "SignInViewController"))
self.present(navController, animated: true, completion: {})
Maintenant, poussez votre contrôleur de vue depuis le contrôleur de vue présenté
self.show(self.storyboard!.instantiateViewController(withIdentifier: "SignUpViewController"), sender: self)