アンワインド セグエを使用することに満足していると仮定しましょう (そうでない場合は、使用しない方法がたくさんあります)。
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"
loggedIn
App 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 キーを押しながら「終了」シンボルにドラッグします)。
