11

SignInViewControllerいつでも必要になる可能性のあるサインインに使用されるビュー コントローラーのサブクラスがあります。サインインが必要であるという通知をアプリ内のすべてのビュー コントローラーにリッスンさせるのではなく、アプリ デリゲートにそれを行わせたいと考えています。

しかし、アプリ デリゲートからトリガーするにはどうすればよいでしょうか。

SignInViewControllerをメインの絵コンテに入れますか? その場合、アプリ デリゲートからストーリーボードにアクセスするにはどうすればよいですか? または、他のアプローチの方が優れていますか?

4

2 に答える 2

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

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

于 2012-04-19T18:31:33.760 に答える
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];
    });
}

通常、これを便利なメソッドでラップし、インスタンス化されたビュー コントローラーを渡します。OP に - ストーリーボードで SignInViewController を作成し、一意のストーリーボード ID を割り当ててから、上記のコードでその ID を置き換えます。

于 2016-02-08T19:31:22.153 に答える