略して:提示されたViewControllerからViewViewControllerをプッシュするにはどうすればよいですか?
概要:
MainViewController
があります。ボタンをクリックすると1つのボタンがあり、LoginViewController
というビューを表示しています。
このページ(LoginViewController
)には、button
があります。クリックすると、View Controllerをプッシュしようとします(HomeViewController
と呼ばれます)。
これが私のコードスニペットです。
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];
}
しかし、私にはうまくいきませんでした。また、pushed
の前にa stack of view controllers
を印刷しましたが、LoginViewController
がありません。したがって、LoginViewController
をa stack of view controllers
に追加せずに、pushed
をHomeViewController
からLoginViewController
に追加するにはどうすればよいですか。
HomeViewController
からgetBackすると、LoginViewController
が開くはずです。
この単一のNavigationController
を使用することは可能ですか?
注:-ここでは、Login、Home、およびMain ViewControllerを使用した例を取り上げました。しかし、私はそれを他の画面に入れたいです。
FirstView(Push
)からMainViewController
する必要がありますが、PresentView
およびDismissView
と同じアニメーションを使用できます。これには次のコードを使用します:-
プッシュの場合(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];
Popの場合(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];
このコードを使用すると、Present-Dismiss ViewControllers
と同じアニメーションを取得できます。詳細については この回答 を参照してください。
その後、Pushing
LoginViewController
〜HomeViewController
のコードを使用できます
希望、これはあなたが探しているものです。心配事は私に戻ります。 :)
こんにちは、ViewView Controllerを提示するときは、次のようなnavigationControllerを提示します。
LoginVC *loginVCObj =[[LoginVC alloc]initWithNibName:@"LoginVC" bundle:nil];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:loginVCObj];
[self presentViewController:nav animated:YES completion:nil];
PresentedViewControllerがnavigtioncontrollerになり、Home VCに簡単にプッシュできるようになりました
HomeViewController *obj = [[HomeViewController alloc] init];
[self.navigationController pushViewController:obj animated:YES];
お役に立てば幸いです
LoginViewController
をNavigation Controllerスタックにプッシュしないでください。以下に「理由」について説明します。
MainViewController
はスタック上にあるはずです-あなたは常にそこに戻りたいです。
// 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];
}
特定のアクションでLoginViewController
を表示します。ユーザーがback
をタップしてMainViewController
にアクセスできるようにしたくない場合。後で、ユーザーがLoginViewController
に戻ることを望まなくなります。このため、モーダルとして提示する必要があります。
// inside `MainViewController.m`
- (IBAction)myCoolActionToShowLogin:(id)sender {
[self presentViewController:[[LoginViewController alloc] init] animated:YES completion:nil];
}
これで、LoginViewController
が表示されます。ユーザーがログインを完了したら、それを閉じて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];
}
ノート:
お気づきかもしれませんが、myAwesomeActionToShowHome:
は、rootViewController
としてNavigation Controllerが必要です。これは動作しますが、より良いはずです-そのナビゲーションがキャストではなく実際にナビゲーションコントローラーであるかどうかを確認する必要があります。または、新しいデリゲートをプッシュするデリゲートまたはブロックを作成できます。これは最速で最も簡単に機能するソリューションであり、後で改善する必要があります。
あなたは本当に読むべきです: Apple Developer-> "View Controller Programming" documentation 、これらはコアの基礎UXを正しく開発および設計するために知っておくべきです。
動作する デモサンプル です。
提示されたView Controllerからプッシュすることはできません。ナビゲーション階層を維持することをお勧めします。
そのためには、MainViewControllerからLoginViewControllerを提示し、MainViewControllerにNavigation Controllerを渡す必要があります。
- (IBAction)openLogin:(id)sender {
LoginViewController *loginVC = (LoginViewController *) [self.storyboard instantiateViewControllerWithIdentifier:@"login"];
[loginVC setReferencedNavigation:self.navigationController];
[self presentViewController:loginVC animated:YES completion:nil];
}
次に、LoginViewController内で、次のようにHomeViewControllerにプッシュする必要があります。
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];
}];
}
これを行うと、LoginViewControllerからプッシュしているように見えますが、実際にはMainViewControllerからプッシュしています。
このフローのアニメーションとUIを維持するために、このアプローチをカスタマイズできます。
1)navigation controller with its
root View Controller`がView Controllerとして設定されています。
- (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];
}
それがあなたのために働くことを願っています。
問題は、LoginViewController
にNavigation Controllerがないことです。それからあなたはそれを1つ与えます。
UINavigationController
を作成し、LoginViewController
をスタックに入れて、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];
}
dismissViewControllerAnimated
でMainViewController
を呼び出します。
UINavigationControllerインスタンスを作成します
[[UINavigationController alloc] initWithRootViewController:[[LoginViewController alloc] init]]
そのnavigationControllerを提示し、任意の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];
}
これは、現在のView ControllerとPush View Controllerの非常にシンプルなコードです。
- (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];
}
このコードをObjective C on buttonactionに置くだけです
UIViewController *yourViewControllerName = [self.storyboard instantiateViewControllerWithIdentifier:@"yourViewControllerName "];
[[self navigationController] pushViewController:yourViewControllerName animated:YES];
Swift 3.0
View Controllerを新しいrootViewControllerとして提示する
let navController = UINavigationController.init(rootViewController: self.storyboard!.instantiateViewController(withIdentifier: "SignInViewController"))
self.present(navController, animated: true, completion: {})
提示されたView ControllerからView Controllerをプッシュします
self.show(self.storyboard!.instantiateViewController(withIdentifier: "SignUpViewController"), sender: self)