私は現在、ユーザーが自分のアカウントを参照できるようにする iOS アプリを開発しています (Web サイトでのアカウント作成)。
接続後にユーザーが自分のアカウントを参照できるようにしたい。だから、ログインビューになる最初のビューが欲しいです。接続を受け入れると、ログイン ビューが消え、最初のビュー コントローラーがデータをロードします。
どうやってやるの?
私は現在、ユーザーが自分のアカウントを参照できるようにする iOS アプリを開発しています (Web サイトでのアカウント作成)。
接続後にユーザーが自分のアカウントを参照できるようにしたい。だから、ログインビューになる最初のビューが欲しいです。接続を受け入れると、ログイン ビューが消え、最初のビュー コントローラーがデータをロードします。
どうやってやるの?
FirstViewController の viewDidAppear で、次のコードを追加して、Login ViewController をタブの前に表示します。
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
AppDelegate * delegate = [[UIApplication sharedApplication] delegate];
if (!delegate.login) { // BOOL value to know if user is logged in or not.If user succefully logged in set value of this as YES else NO.
LoginViewController * lvc = [[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:nil];
[self presentModalViewController:lvc animated:NO];
[lvc release];
}
}
presentModalViewController(_:animated:completion:)
ログインビューコントローラーを表示するために使用できます。
ログインに成功しdismissModalViewControllerAnimated(_:completion:)
たら、View Controller を閉じると、タブ バーが表示されます。
モーダル ビュー コントローラー アプローチを試しました (つまり、ログイン ビュー コントローラーを起動時にモーダルに表示し、 にanimated:
設定しfalse
ます)、問題がありますviewWillAppear(animated:)
。試行が遅すぎると (つまりviewDidAppear(animated:)
)、基になるビュー コントローラーが一瞬だけ「表示」されます (少なくとも iOS 8 では)。
代わりに、ログイン ビュー コントローラーをウィンドウのルート ビュー コントローラー (メイン ストーリーボードの初期ビュー コントローラーとして設定) としてアプリを起動し、認証が成功したら、アプリのルート ビュー コントローラーを「交換」します。メイン タブ バー コントローラー (別のストーリーボードから遅延してインスタンス化します)。
すぐにではなく、スムーズな遷移 (アニメーション) でこれを実現するために、ログイン ビュー コントローラー内で次のようなコードを使用します。
// Run this code when authentication succeeds:
UIView.transitionWithView(self.view.window,
duration: 0.3,
options: UIViewAnimationOptions.TransitionCrossDissolve,
animations: {
window.rootViewController = tabBarController
},
completion: nil
)
(ここから取られたアイデア)
ただし、私が遭遇した 1 つの問題は、挿入しようとしていたタブ バーに、選択した (現在の) タブにナビゲーション コントローラーが含まれていて、移行中にナビゲーション バーが上にシフトして表示され、アプリのステータス バーを「アンダーラップ」することだけでした。アニメーションの完了時に正しい位置に戻ります。非常に面倒です...ナビゲーションコントローラーに含まれる子ビューコントローラーに次のコード行を追加することで修正しました:
override func viewWillAppear(animated: Bool)
{
super.viewWillAppear(animated)
self.navigationController?.navigationBar.layer.removeAllAnimations()
}
(ここから取得した修正)
更新:一部のシミュレーター (iPhone 6+、iOS 9.0) では、ナビゲーション バーの「ジャンプ」が発生せず、代わりに素早い (ただし穏やかな) アニメーションが表示されることに気付きました。