web-dev-qa-db-ja.com

iOSの表示されたView Controllerからのビューのプッシュ

略して:提示された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がありません。したがって、LoginViewControllera stack of view controllersに追加せずに、pushedHomeViewControllerからLoginViewControllerに追加するにはどうすればよいですか。

HomeViewControllerからgetBackすると、LoginViewControllerが開くはずです。

この単一のNavigationControllerを使用することは可能ですか?

注:-ここでは、Login、Home、およびMain ViewControllerを使用した例を取り上げました。しかし、私はそれを他の画面に入れたいです。

25
Meet Doshi

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と同じアニメーションを取得できます。詳細については この回答 を参照してください。

その後、PushingLoginViewControllerHomeViewControllerのコードを使用できます

希望、これはあなたが探しているものです。心配事は私に戻ります。 :)

3
Meet Doshi

こんにちは、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];

お役に立てば幸いです

25
Shubham bairagi

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を正しく開発および設計するために知っておくべきです。

動作する デモサンプル です。

11
Vive

提示された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を維持するために、このアプローチをカスタマイズできます。

enter image description here

9
Hemang

1)navigation controller with itsroot 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];
}

それがあなたのために働くことを願っています。

8
Rohit Pradhan

問題は、LoginViewControllerにNavigation Controllerがないことです。それからあなたはそれを1つ与えます。

MainViewController.m

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];
}

LoginViewController.m

- (IBAction)buttonActionMethodOnLoginView:(id)sender{
    HomeViewController *obj = [[HomeViewController alloc] init];
    [self.navigationController pushViewController:obj animated:YES];
}

却下する

dismissViewControllerAnimatedMainViewControllerを呼び出します。

6
ukim

UINavigationControllerインスタンスを作成します

[[UINavigationController alloc] initWithRootViewController:[[LoginViewController alloc] init]]

そのnavigationControllerを提示し、任意のVCを押してください。

4
Hunaid Hassan

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];
}
4
darshan

これは、現在の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];
}
4
Bera Bhavin

このコードをObjective C on buttonactionに置くだけです

UIViewController *yourViewControllerName = [self.storyboard instantiateViewControllerWithIdentifier:@"yourViewControllerName "];

[[self navigationController] pushViewController:yourViewControllerName  animated:YES];
3
iTALIYA

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)
3
emraz