0

StoryBoards を使用してiOS6.1でUINavigationControllersとUITabBarControllersを処理する方法について、適切な説明が必要です。

  1. アプリ (1 番目の ViewController) をロードすると、if (FB login = success) が必要で、セグエで 2 番目の ViewController に自動的にジャンプします。UINavigationControllerここではlike root は 使えないと思いますが、apple の HIG は嫌いです。画像1
  2. UITabBarController3 つに接続するが必要ですUICollectionViewControllers(それぞれに 1 つのタブ)。UITabBarController私は好きなルートを置く必要がありますか?はいの場合、それらの間の他のViewontrollerをどのように処理できますか? このような: 画像2
  3. CollectionViewController ごとにカスタム BarButtonItem (画像 2 に表示されている「すべて削除」など) が必要ですが、UINavigationControllerそれぞれに a を使用する必要がありますか?
4

1 に答える 1

3

アンワインド セグエを使用することに満足していると仮定しましょう (そうでない場合は、使用しない方法がたくさんあります)。

1 アプリ (1 番目の ViewController) をロードすると、if (FB login = success) が必要で、セグエで 2 番目の ViewController に自動的にジャンプします。ここで、ルートのような UINavigationController を使用できないと思います。Apple の HIG はそれを好みません。

最初の VC (loginVC と呼びましょう)..
- ナビゲーション コントローラーに含めないでください。
- アプリケーションの initialViewController として設定する必要があります

2 番目の VC (startVC と呼びましょう)
- Navigation Controller に含める必要があります
- その Navigation Controller の Identity Inspector で、storyboardID を割り当てます。@"InitialNavController"

loggedInApp Delegate で、 BOOL プロパティを用意しましょう。

@property (nonatomic, assign) BOOL loggedIn;

さて、LogInViewController で...

すでにログインしているかどうかを確認します。viewDidAppearログインしている場合は、すぐに startVC に移動します。

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    if ([(AppDelegate*)[[UIApplication sharedApplication] delegate] loggedIn]) {
        UINavigationController* navController = 
           [[self storyboard] instantiateViewControllerWithIdentifier:@"InitialNavController"];
        [self presentViewController:navController
                           animated:NO
                         completion:nil];
    }
}

これは、(たとえば) viewDidLoad ではなく、viewDidAppear に配置することが重要です。最初のビューが適切に初期化され、画面上に表示されない限り、セグエは機能しません。

アンワインド セグエを作成します (そして で宣言しloginVCます@interface) … ユーザーがログアウトした場合、loginVC が宛先 VC になります。

- (IBAction)unwindOnLogout:(UIStoryboardSegue *)segue 
{
    [(AppDelegate*)[[UIApplication sharedApplication] delegate] setLoggedIn:NO];

}

(修正 - この行
[[self presentedViewController] dismissViewControllerAnimated:YES completion:nil];
を削除しました。セグエが舞台裏で既にそれを行っているため、閉じる必要はありません。これは冗長であり、エラー メッセージがログに記録されます)

他のviewControllerでは、必要に応じて「ログアウト」ボタンを作成できます。そのボタンからストーリーボードの ViewController の下部にある「終了」記号まで CTRL-ドラッグすると、このセグエをアンワインド セグエとして選択できるようになります。

2 3 つの UICollectionViewControllers (それぞれに 1 つのタブ) に接続する UITabBarController が必要です。UITabBarController をルートのように配置する必要がありますか? はいの場合、それらの間の他のViewontrollerをどのように処理できますか? このような:

以前のviewController(startVC)でtabBarControllerがNavigationControllerにどのように関連するかを理解しようとしていると思います。答えは、そうすべきではありません。Tab Bar VC を前の Nav Controller に埋め込むと、Tab Bar の子 viewControllers に奇妙な状況が生じるため、実際には埋め込みたくありません。

startVC から tabBarVC へのナビゲーションは、プッシュ セグエではなくモーダル セグエ経由で行う必要があります。

tabBarController の viewController からの戻りを容易にするために、startVC で別の巻き戻しセグエを作成できます。

- (IBAction)unwindToInitialNavFromModal:(UIStoryboardSegue *)segue {

}

(修正 - この行を削除:   [[self presentedViewController] dismissViewControllerAnimated:YES completion:nil];   このメソッドは、却下を実行するためのコンテンツを必要としません)

3 各 CollectionViewController にカスタム BarButtonItem (画像 2 に表示されている「すべて削除」など) が必要です。それぞれに UINavigationController を使用する必要がありますか?

デフォルトでは、tabBarVC にナビゲーション バーは表示されません。

2 つの方法で提供できます
。各子 viewController を独自の Navigation Controller に埋め込みます。
- ナビゲーション バーを各子 viewController のシーンに手動でドラッグします。

どちらでもかまいません。実際には、他の ViewController へのナビゲーションが必要かどうかによって異なります。

その後、左または右に barButtonItem を追加して、initialVC のアンワインド セグエに接続できます (Ctrl キーを押しながら「終了」シンボルにドラッグします)。

ここに画像の説明を入力

于 2013-03-16T20:03:35.070 に答える