2012-05-10 2 views
5

起動時に有効なログイン資格情報があるかどうかをチェックし、見つかって期限切れになっていない場合はメインスプリットビューコントローラが表示され、そうでなければログイン画面が表示されるはずです。performEdgeをAppDelegateと共に使用できますか?

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

私は、ルートビューコントローラからモーダルセグエを設定しようとした、と私のアプリケーションでいる:didFinishLaunchingWithOptions:アプリの委任内の関数、これを呼び出す:

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

は、これは論理的に動作するはずですが、からseguesをトリガアプリケーション内の代理人は不可能と思われる。

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

+0

なぜあなたはデリゲートを投げたのですか?なぜViewDidLoadの最初のことではないのですか – Sirens

答えて

4

この投稿hiding-a-segue-on-login-processのようにカスタムセグを試すことができます。また

あなたが分割ビューコントローラの負荷は、次の線に沿って何かをしようとする前に、ログイン画面を持っているために必死なら...

UIViewControllerのサブクラスで、たとえば、などメインストーリーボード上のログイン画面を作成します。 。それが最初のシーンであることを確認してください(は初期ビューコントローラです)。

ストーリーボードで、ログインクラスから元の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 
+0

私はこれを試みることはありませんでしたが、これらは非常に巧妙な解決策のようです。 – radven

1

適切で期限切れでないログイン資格情報(ウィンドウのルートビューコントローラとして設定する)を使用して表示される画面をロードしてから、その最初のビューコントローラのviewDidLoadで、ログイン資格情報の更新が必要かどうかを確認してください。その場合は、ログインビューコントローラに接続します。

+0

Appleは分割ビューコントローラをルートにする必要があるので、サブクラス化しない限りviewDidLoadをタップする場所は実際にはありません。よりシンプルな方法があるはずです。 – radven

+0

したがって、分割をルートにして、View ControllerのviewDidLoadをチェックインします。アイデアは同じです。 – jmstone617

+0

私は今、それを試みました - そしてviewDidLoadのseguesは動作していません。私はいくつかの詳細については、別の、しかし関連する質問をここで:質問しました:http://stackoverflow.com/questions/10541852/correctly-present-conditional-login-screen-at-app-startup-with-storyboardsands – radven

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" として割り当てられますビューからセグエを作成希望の任意のビュー、およびその新しいsegueにid fileSegueIDを与えます。rootController変数が正しいビューに割り当てられるようにするには、デバッグが必要です。

+2

ありがとう! '[[self window] makeKeyAndVisible];'は私が行方不明だったものです。 –

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

これは、segueの親ビューコントローラへの参照を取得した場合に使用できます。あなたはこのようにそれを得ることができます:それはもちろん存在する場合viewControllers配列のインデックスはあなたのビューコントローラのいずれかに一致している場合にのみ動作します

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

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

。この場合、最初のものが(アレイとストーリーボードの中に)あります。

segue( "LoginScreen")は、アクションに添付してはいけません。これを行う方法は、ストーリーボードシーンの一番下にあるファイル所有者アイコンから目的のシーンにドラッグしてコントロールすることです。 "Manual Segue"でオプションを尋ねるポップアップが表示されます。タイプとして「プッシュ」を選択します。小さな四角形をタップし、Attributes Inspectorにいることを確認します。それをコードで参照するために使用する識別子を与えます。

関連する問題