2012-04-19 1 views
11

私はビューコントローラのサブクラスであるSignInViewControllerを使用しています。サインインにはいつでも必要な場合があります。私のアプリのすべてのビューコントローラにサインインが必要であることを知らせるのではなく、アプリの代理人がそれを行うようにしたいと思います。アプリデリゲートのストーリーボードビューコントローラーはありますか?

しかし、私はどのように私のアプリケーションデリゲートからそれを引き起こすのですか?

私のメインストーリーボードにSignInViewControllerを入れますか?もしそうなら、私のアプリデリゲートから私のストーリーボードにアクセスするにはどうしたらいいですか?それとも、他のアプローチが良いですか?

答えて

24

あなたはいつでもUIApplicationシングルトンを通してあなたのアプリケーションデリゲートを参照することができます。 そこから、いつでもあなたのルートビューコントローラを手に入れることができます。 ルートビューコントローラでは、ストーリーボードへの参照を取得できます。

ストーリーボードを作成したら、必要なビューコントローラーのインスタンスをインスタンス化するだけです。 プレゼント。

AppDelegate* appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate]; 
MainViewController *mvc = (MainViewController *)appDelegate.window.rootViewController;  
LoginViewController *lvc = [mvc.storyboard instantiateViewControllerWithIdentifier:@"LoginViewController"]; 
[currentVC presentModalViewController:lvc animated:YES]; 

あなたのストーリーボードへの参照を取得するより直接的な方法があるかもしれませんが、ほとんどの場合それがあなたのために得られます。

+0

「currentVC」とは何ですか? – Andreas

+0

"currentVC"の代わりに "self"というキーワードを使用して、現在作業中のビューコントローラを参照することを意味します。 –

+5

しかし、彼はappDelegateからプレゼンテーションについて質問しました。 "前に"どんなviewcontrollerに入れても私は賭けました。 – Zerho

0

どこからでも(アプリケーションデリゲートを含む)ビューコントローラを表示するために、私はこのコードをiOS 8以降で成功させました(以前の互換性についてはわかりません)。それがある場合はモーダルビューから表示されます。

YOURAppDelegate *appDelegate = (YOURAppDelegate *)[[UIApplication sharedApplication] delegate]; 
UINavigationController *rootNavC = (UINavigationController *)appDelegate.window.rootViewController; 
UIViewController *topVC = rootNavC.topViewController; 

UIViewController *myNewVC = [rootNavC.storyboard instantiateViewControllerWithIdentifier:<YOUR STORYBOARD ID>]; 

if (topVC.presentedViewController) 
{ 
    if ([topVC.presentedViewController class] == [UINavigationController class]) 
    { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [((UINavigationController*)topVC.presentedViewController) pushViewController:myNewVC 
                       animated:YES]; 
     }); 
    } 
    else 
    { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [topVC.presentedViewController.navigationController pushViewController:myNewVC 
                      animated:animated]; 
     }); 
    } 
} 
else 
{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [rootNavC pushViewController:myNewVC 
          animated:animated]; 
    }); 
} 

私は通常このメソッドを簡易メソッドでラップし、インスタンス化されたView Controllerを渡します。 OPにするには、ストーリーボードにSignInViewControllerを作成し、一意のストーリーボードIDを割り当てて、上記のコードでそのIDを置き換えます。

関連する問題