1

初期ビューとして LoginViewController を持つアプリがあります。

注:したがって、appDelegate.m では、self.window.rootViewController は TabBarController ではありません。 ここに画像の説明を入力

Auth の後、2 つのタブを持つ tabbarController (identifier:tabBar) と 1 つのタブにナビゲーション コントローラーがあるアプリの主要部分を示します。Core Data を使用しているため、MOC を渡す必要があります。

私が使用する場合、

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UITabBarController *obj=[storyboard instantiateViewControllerWithIdentifier:@"tabBar"];
[obj setSelectedIndex:0];// Which tab to show first
[self presentModalViewController:obj animated:YES];

視覚的にうまく機能します。次に、MOC に合格する必要があります。PrepareToSegue メソッドについて読み、loginVC から TargetViewController (TabBar>NavigationController1>View1) へのセグエ (モーダル、写真には表示されていません) を作成し、セグエに「LoginSegue」という名前を付け、次のコードを使用しました。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
UINavigationController *navController = (UINavigationController *)[segue destinationViewController];
View1 *devicelist = (View1 *)[[navController viewControllers] lastObject];
devicelist.managedObjectContext = managedObjectContext;
}

TabBar は表示されません。この場合、タブバー コントローラーを設定するにはどうすればよいですか?

Modal Tabbar の参照を取得する方法を理解しようとしていますが、まだ明確ではありません。このような状況に対処する方法を素人の言葉で説明できる人はいますか?

4

1 に答える 1

0

タブバーコントローラーへのモーダル遷移を使わないデザインにした方が良いと思います。モーダル プレゼンテーションは通常、メイン コントローラーを画面に表示するためではなく、アプリの通常のフローを中断するためのものです。私がより良いと思う2つの選択肢があります。ログイン コントローラーをウィンドウの初期ルート ビュー コントローラーのままにしておくことができますが、タブ バー コントローラーに切り替えることができます (ウィンドウの新しいルート ビュー コントローラーになり、ログイン コントローラーの割り当てが解除されます)。これは通常は問題なく動作しますが、MOC をアプリ デリゲート (推測) からタブ バー コントローラーのコントローラーに渡したい場合は、2 番目の方法の方がよいと思います。

これを行う 2 番目の方法、および私が通常行うログイン コントローラーの方法は、タブ バー コントローラーをウィンドウのルート ビュー コントローラーにし、初期ビューの viewDidAppear メソッドからモーダルにログイン コントローラーを提示することです (これにより、 View1 を呼び出しているものである必要があります)。アニメーションを NO に設定してこのプレゼンテーションを行うと、ログイン コントローラーがユーザーに最初に表示されます。

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    static int first = 1;
    if (first) {
        LoginViewController *login = [self.storyboard instantiateViewControllerWithIdentifier:@"Login"];
        [self presentViewController:login animated:NO completion:nil];
        first = 0;
    }
}

if ステートメントがそこにあるので、ログイン コントローラーから戻ったときにプレゼンテーションが再び発生することはありません (必要に応じて、ログイン コントローラーから View1 にデリゲート コールバックを行い、ログインが成功したことを示すなど、より洗練された処理を行うことができます)。 、しかしこれは機能します)。

ログインが成功した場合は、ログイン コントローラーを閉じるだけで、最初のビューが表示されます (失敗した場合は、決して閉じず、ログインが失敗したというメッセージを表示する場合があります)。

このルートに進む場合は、次のようにアプリ デリゲートで MOC を渡すことができます。

UINavigationController *nav = [(UITabBarController *)self.window.rootViewController viewControllers][0];
View1 *devicelist = (View1 *)nav.viewControllers.lastObject;
devicelist.managedObjectContext = managedObjectContext;
于 2013-05-10T01:37:14.180 に答える