4

これは単純であるように思えますが、多くの困難なニュアンスがあることが証明されています.スタックオーバーフローの他の場所で、これに完全に、明確に、そして簡単に答えている答えを見つけていません.

簡単に言えば、ストーリーボードを使用してアプリケーション フローをレイアウトする iPad アプリケーションと、プライマリ ルート ビュー コントローラーとして分割ビュー コントローラーがあります。

このアプリケーションは起動時に、ログイン資格情報が保存されているかどうかを確認し、保存されている場合は直接 UI にジャンプし、そうでない場合はフルスクリーンのログイン ページを表示します。

ただし、この条件チェックはどこで行うべきで、ログイン画面はどのようにインスタンス化する必要があるのでしょうか?

考えられるすべての順列を試しました。

アプリではデリゲートは明らかな場所のように見えますが、ストーリーボードからのビューがまだライブではないため、セグエまたはモーダル ポップアップの呼び出しは無視されているようです。

分割ビューの詳細コントローラーの起動メソッドでは、次の明らかな場所のようです。

私が見つけることができる最も実用的なソリューションは、 https ://stackoverflow.com/a/8224389/529774 で説明されています。

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"Login"];
    [vc setModalPresentationStyle:UIModalPresentationFullScreen];

    [self presentModalViewController:vc animated:NO];
}

しかし、分割ビューの詳細ビュー コントローラによって呼び出されるこの実装では、基になる分割ビューが画面上で短時間点滅します。

viewDidAppear から viewWillAppear に変更すると、フラッシュは発生しませんが、画面が横向きに回転しても、ログイン ビューは縦向きで描画されます。

私が言ったように、この種の条件付きログイン表示は一般的で簡単であるように思えますが、分割ビュー、ストーリーボード、回転認識を組み合わせ、UI が点滅しないようにする単純な作業例はどこにも見つかりません。

任意のヒント?うまくいく例へのポインタ?

4

4 に答える 4

2

私はまったく同じ問題を抱えていましたが、多くの検索を行った後、Duane の回答から洞察が得られました。彼の答えは前のビューでまだ​​点滅していますが、次を使用して問題を解決しました。

-(void)viewWillAppear:(BOOL)animated {

    // Check if user is already logged in
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    if ([[prefs objectForKey:@"log"] intValue] == 1) {
        self.view.hidden = YES;
    }
}

-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];

    // Check if user is already logged in
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    if ([[prefs objectForKey:@"log"] intValue] == 1) {
        [self performSegueWithIdentifier:@"homeSeg3" sender:self];
    }
}

-(void)viewDidUnload {
    self.view.hidden = NO;
}
于 2012-09-02T15:09:58.847 に答える
1

サブビューを追加する前に、window.hidden プロパティを NO に設定する必要があります。

UITabBarController* tc = (UITabBarController*) self.window.rootViewController;

// Present the log in view controller
self.window.hidden = NO; // the window is initially hidden
[tc presentViewController:logInViewController animated:NO completion:NULL];
于 2012-07-19T14:51:45.257 に答える
0

これは私がSWIFTでそれを解決した方法です

override func viewWillAppear(animated: Bool) {
    let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()

    let isloggedIn = prefs.objectForKey("isLoggedIn") as? Bool
    if (isloggedIn != false) {
        self.view.hidden = true
    } else {
        self.view.hidden = false
    }
}

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(true)

    let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()

    let isloggedIn = prefs.objectForKey("isLoggedIn") as? Bool
    if (isloggedIn != false) {
        println("this should work")
        self.performSegueWithIdentifier("Login", sender: self)
    }
}
于 2014-11-10T05:01:07.343 に答える
-1

ユーザーに表示される最初のView Controllerをログイン画面にすることで、これを行うことができました。次に、タブビューまたは分割ビューなど、必要なものを使用して次の画面に接続されたセグエがあります。

この最初のコントローラーは、デフォルトとログイン資格情報を処理し、すべてがチェックおよび検証されると、セグエに従います。それ以外の場合は、ユーザーにログインおよび/またはエラーを表示し、そこに座ります。

于 2012-05-22T20:05:23.183 に答える