5

起動時に有効なログイン資格情報をチェックするアプリに取り組んでおり、それらが見つかって期限切れになっていない場合はメインの分割ビューコントローラーが表示され、そうでない場合はログイン画面が表示されます。

各パーツは個別に正常に動作していますが、起動時に表示する適切なビューを選択するための最良の方法に苦労しています.

ルートビューコントローラーからモーダルセグエを設定しようとしましたが、アプリケーションデリゲートのアプリケーション:didFinishLaunchingWithOptions: 関数で、これを呼び出します:

// Segue to the login view controller...
if (loginNeeded) {
    [self.window.rootViewController performSegueWithIdentifier:@"LoginScreen" sender:self];
}

これは論理的には機能するはずですが、アプリ デリゲート内からセグエをトリガーすることは不可能のようです。

これを処理するための理想的な場所とテクニックは何ですか?

4

5 に答える 5

4

この投稿hide-a-segue-on-login-processに従って、カスタム セグエを試すことができます。

または、Split View Controller が読み込まれる前にログイン画面を表示したい場合は、次の行に沿って何かを試してください...

のサブクラスなどとして、メインのストーリーボードにログイン画面を作成しますUIViewController。それが最初のシーンであることを確認します ( Is Initial View Controllerをチェックします)。

ストーリーボードで、ログイン クラスから元の SplitViewController への新しいセグエを作成します。識別子 ' Load SplitViewController' と、 と呼ぶセグエ カスタム クラス名を付けますFullyReplaceSegue

ログイン クラス .m ファイルに、ユーザーがログインしたときに呼び出されるコードを追加します。

[self performSegueWithIdentifier:@"Load SplitViewController" sender:self];

に基づいて新しいセグエ クラスを作成し、上記のようUIStoryboardSegueに名前を付けFullyReplaceSegueます。

.h ファイル

#import <UIKit/UIKit.h>
@interface  : UIStoryboardSegue

@end

.m ファイル

#import "FullyReplaceSegue.h"

@implementation FullyReplaceSegue

- (void)perform
{
    UIViewController *dest = (UIViewController *) super.destinationViewController;
    UIWindow *window = [UIApplication sharedApplication].keyWindow;
    window.rootViewController = dest;

    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
        UISplitViewController *splitViewController = (UISplitViewController *)dest;  // assumes we're transitioning to a UISplitViewController!
        UINavigationController *navigationController = [splitViewController.viewControllers lastObject];
        splitViewController.delegate = (id)navigationController.topViewController;
    }
}

@end
于 2012-05-27T11:54:24.790 に答える
4

これが私がやった方法です。

didFinishLaunchingWithOptions で:

//save the root view controller
[[self window] makeKeyAndVisible];
UINavigationController *navigationController = (UINavigationController*) self.window.rootViewController;
rootController = [[navigationController viewControllers] objectAtIndex:0];

アプリ デリゲートの別の場所:

[rootController performSegueWithIdentifier:@"fileSegueID" sender:self];

次に、ストーリーボードで、「rootController」として割り当てられるビューから目的のオプション ビューへのセグエを作成し、その新しいセグエに id を付けfileSegueIDます。rootController変数が正しいビューに割り当てられるようにするには、ある程度のデバッグが必要です。

于 2012-07-30T19:45:51.763 に答える
2

少し遅いかもしれませんが、同じ提案を探していました。これが私がやったことです。

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Signup" bundle:nil];
    if(isLoggedIn) {
    UINavigationController *navigationController = (UINavigationController*) self.window.rootViewController;
    IndexController *ivc = [storyboard instantiateViewControllerWithIdentifier:@"IndexController"];
    [navigationController pushViewController:ivc animated:NO];
}
于 2012-12-11T18:05:14.740 に答える
1

適切で有効期限が切れていないログインクレデンシャルを想定して表示される画面をロードし(ウィンドウのルートビューコントローラーとして設定することにより)、最初のビューコントローラーのviewDidLoadで、更新されているかどうかを確認します。ログインクレデンシャルに必要です。その場合は、ログインビューコントローラにセグエします。

于 2012-05-10T18:40:04.047 に答える
0

はい、セグエの親ビュー コントローラーへの参照を取得する場合は使用できます。次のように取得できます。

UINavigationController *navigationController = (UINavigationController*) self.window.rootViewController;

[[[navigationController viewControllers] objectAtIndex:0] performSegueWithIdentifier:@"LoginScreen" sender:self];

これは、viewControllers 配列のインデックスがビュー コントローラーのインデックスと一致し、もちろん存在する場合にのみ機能します。この場合、最初のものです (配列とストーリーボード内)。

セグエ (「LoginScreen」) をアクションに添付してはなりません。これを行う方法は、ストーリーボード シーンの下部にあるファイル所有者アイコンから目的のシーンまで、コントロールを押しながらドラッグすることです。「手動セグエ」のオプションを求めるポップアップが表示されます。タイプとして「プッシュ」を選択します。小さな四角形をタップして、属性インスペクターにいることを確認します。コードで参照するために使用する識別子を指定します。

于 2014-04-01T22:43:20.570 に答える