2

私は iOS を学び、初めての iPhone アプリを開発しています。アプリに機能を追加したい: ユーザーが以前にログインしたことがある場合、ユーザーをメイン ビューにリダイレクトしたい。それ以外の場合は、ユーザーをログイン ビューにリダイレクトします。

ios change storyboard default view controller at run timeを読んだのですが、AppDelegateでルートビューを決めるコードを書けるかどうか迷っています。したがって、起動されないビューはありません。

これはAppDelegateの私のコードです:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
     (UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];


    MainViewController *rootVC = [[MainViewController alloc] init];
    if (userNeverLogin) {
       LoginViewController *rootVC = [[LoginViewController alloc] init];
    }

    self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:rootVC];
    return YES;
}

このコードは機能しません (エラーは発生しませんが、シミュレーターには何も表示されません)。どのように見直せばよいですか?または、AppDelegate でこの機能を実行することは不可能ですか?

iOS初心者ですみません。この質問がばかげていないことを願っています。

4

6 に答える 6

3

AppDelegate から条件付きでストーリーボードのさまざまな場所で開始する@followben からの答えが、実際に私が欲しいものであることが最終的にわかりました。これは彼のサンプルコードです:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{        
    BOOL isLoggedIn = ...;    // from your server response

    NSString *segueId = isLoggedIn ? @"MainIdentifier" : @"LoginIdentifier";
    self.window.rootViewController = [self.window.rootViewController.storyboard instantiateViewControllerWithIdentifier:segueId];

    return YES;
}

ビューコントローラー識別子を設定する方法:ここに画像の説明を入力

@ekims と @X Slash の両方に、あなたの刺激的な議論に +1 を付けました。心から感謝します。

于 2012-11-30T06:51:05.280 に答える
3

表示するView Controllerの初期化全体をif-elseステートメントに入れてみます。入力するように設定rootVCMainViewControllerていて、ユーザーがログインしていない場合は、入力するように変更しようとしていrootVCますLoginViewController

例えば

id rootVC = nil;    
if (userNeverLogin) {
   rootVC = [[LoginViewController alloc] init];
} else {
   rootVC = [[MainViewController alloc] init];
}

self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:rootVC];

ビューが表示されないための更新

nib名でView Controllerを初期化する方法を作成していない場合(他の人が提案していること)、別の回避策があります。をクリックしMainViewController.xib、Interface Builder で をクリックしFile Ownerます。ユーティリティサイドバー(画面右側)の左から3番目のアイコン をクリックし、Identity Inspectorカスタムクラスを に変更しMainViewControllerます。あなたのために同じことをしてくださいLoginViewController.xib

于 2012-11-29T05:19:16.463 に答える
2

あなたのコードでは、

MainViewController *rootVC = [[MainViewController alloc] init];
if (userNeverLogin) 
{
   LoginViewController *rootVC = [[LoginViewController alloc] init];
}
self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:rootVC];

userNeverLogin が true の場合、その if ブロック内の rootVC はその if ブロック スコープ専用であるため、rootVc は常に MainViewController になります。

id rootViewController = nil;
if (userNeverLogin)
{
    rootViewController = [[LoginViewController alloc] init];
}
else
{
    rootViewController = [[MainViewController alloc] init];
}
self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:rootViewController];
于 2012-11-29T05:30:45.580 に答える
0

Appデリゲートでルートビューコントローラを決定することはうまくいくはずです。

私はあなたが欠けているものはにあると思います

 MainViewController *rootVC = [[MainViewController alloc] init];

このようにコントローラーを初期化してみてください

 MainViewController *rootVC = [[MainViewController alloc] initWithNibName:@"nibFileName" bundle:nil];
于 2012-11-29T07:20:46.470 に答える
0

View が Nib から読み込まれている場合は、これを試してください。

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
         (UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];



        if (userNeverLogin) {
           LoginViewController *rootVC = [[LoginViewController alloc] nitwithNibName:@"LoginViewController" Bundle:nil];
        }
else
 MainViewController *rootVC = [[MainViewController alloc] initwithNibName:@"MainViewController" Bundle:nil];

    UINavigationcontroller *nvc= = [[UINavigationController alloc] initWithRootViewController:rootVC];
        self.window.rootViewController=nvc;
        return YES;
    } 
于 2012-11-29T05:22:33.787 に答える
0
Follow this Steps:

1>keep your LoginView as a rootView       
2>In View viewDidAppear of LoginView check this
-(void)viewDidAppear:(BOOL)animated{
   [super viewDidAppear:animated];
   if ([User isLogin] == YES) {
   MainViewController *viewC = [[MainViewController alloc]     initWithNibName:@"EditStoreViewController" bundle:nil];
   [self.navigationController pushViewController:viewC animated:YES];
}

}

これはあなたの問題を解決します

于 2012-11-29T07:26:17.963 に答える