3

iOS6.1SDKを搭載したxcode4.6にタブビューコントローラーとログインビューコントローラーがあります

ここに画像の説明を入力してください

アプリの起動時に「ViewController1」が読み込まれます。ユーザーがログインしていない場合、どうすればログインビューを表示できますか?View Controller 1のviewDidLoad()に、次のコードを挿入しました。

MyNewAppAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
if(!appDelegate.isUserLogged){

    UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    LoginViewController *controller = (LoginViewController*)[mainStoryboard instantiateViewControllerWithIdentifier:@"LoginView"];
    [self presentViewController:controller animated:YES completion: nil];

}

しかし、何も起こりません。Login View Controllerを表示するにはどうすればよいですか?

ご協力ありがとうございました

4

2 に答える 2

2

Xcode4.6およびiOS6.1でXamarinStudio4.0を使用しており、ストーリーボードを使用してログイン画面を表示することができました。私のコードはC#ですが、Objective-Cに相当するものに変換できると確信しています。

ストーリーボードを使用する場合、ウィンドウとRootViewControllerは、ストーリーボードの「初期シーン」ですでに設定されています。そのため、AppDelegateで、「ストーリーボードID」を使用してLoginViewControllerのインスタンスをインスタンス化します。次に、現在のRootViewControllerのインスタンスをキャッシュしてから、新しいLoginViewControllerをRootViewControllerとして設定します。

[Register ("AppDelegate")]
public partial class AppDelegate : UIApplicationDelegate
{
    LoginViewController loginController;

    public override UIWindow Window { get; set; }

    public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
    {
        loginController = Window.RootViewController.Storyboard.InstantiateViewController("LoginScene") as LoginViewController;
        loginController.InitialViewController = Window.RootViewController;

        Window.RootViewController = loginController;

        return true;
    }
    //... other overrides ...
}

LoginViewController内に、InitialViewControllerとログインボタンのアクションを保持するプロパティを作成しました。ログイン作業が完了したら、RootViewControllerをキャッシュされたInitialViewControllerにリセットしてから、現在のLoginViewControllerを閉じます。

public partial class LoginViewController : UIViewController
{
    public UIViewController InitialViewController { get; set; }

    public LoginViewController (IntPtr handle) : base (handle)
    {
    }

    partial void OnLoginClicked(MonoTouch.UIKit.UIBarButtonItem sender)
    {
        //... do login work here ...
        UIApplication.SharedApplication.Delegate.Window.RootViewController = InitialViewController;
        DismissViewController(false, null);
    }
}

LoginViewControllerは、ストーリーボードにあるのと同じようにスタンドアロンにすることができます。他のシーンに接続したり、セグエを使用したりする必要はありません。

于 2013-02-27T21:48:33.720 に答える
0

これは私がこれを行うために働くObjectiveCコードです。ストーリーボードでは、タブバーコントローラーがルートビューコントローラーとして設定されていることに注意してください(つまり、[初期ビューコントローラー]の横にチェックマークが付いています)。コードはこの設定をオーバーライドして、代わりにスタンドアロンのログインビューコントローラーをポップアップさせます。

//Note that my storyboard file's name is "Main.storyboard"--here you put the name of the storyboard file WITHOUT The extension, which is why I just say "Main" here.        
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
//On the storyboard, you must set the Storyboard ID of the Login View Controller to the name "LoginForm" that is used below, so the code can find the View Controller referred to
UIViewController *loginController = [storyboard instantiateViewControllerWithIdentifier:@"LoginForm"];
self.window.rootViewController = loginController;

Login View Controllerで、ログインが正しいことが確認されたために自分自身を閉じる準備ができたら、次のようにAppDelegateのメソッドを呼び出します。

//Be sure to import the App Delegate at the top with #import "AppDelegate.h"
AppDelegate *myAppDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
[myAppDelegate showMainScreen];

App Delegateで、これが「showMainScreen」メソッドです。ルートビューコントローラーとして一時的に設定されていたログインビューコントローラーを閉じ、メイン画面をルートビューコントローラーとして戻していることに注意してください。

- (void)showMainScreen {
    [self.window.rootViewController dismissViewControllerAnimated:YES completion:nil];
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    UITabBarController *main = [storyboard instantiateViewControllerWithIdentifier:@"tabBarForm"];
    self.window.rootViewController = main;
}

もう1つのヒント:セキュリティ対策として、アプリが最小化されるたびにログイン画面をポップアップするのが好きなのでapplicationWillEnterForeground、ログインコントローラーが起動するたびにスワップする方法として、アプリデリゲートのメソッドを呼び出します。

- (void)applicationWillEnterForeground:(UIApplication *)application {
    [self showLoginScreenIfNecessary];
}
于 2014-11-10T06:48:34.237 に答える