質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

6107閲覧

ログインを起動時に判定して表示する画面を振り分けたい。NavigationControllerなどが表示されない...

退会済みユーザー

退会済みユーザー

総合スコア0

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

2クリップ

投稿2017/10/18 13:58

編集2017/10/18 14:13

###前提・実現したいこと
ここ一ヶ月弱ほど、Swiftの勉強をしていて、SwiftとXcodeでログイン・ログアウト機能を実装したiOSアプリを作成しています。
今回質問させていただくのは、ログイン・ログアウト機能の実装についてです。

ログインログアウト機能自体はFirebase Authを使用して実装することはできました。

問題は、タイムラインを表示する前にログイン判定をして、ログインしていなかったらログイン画面に遷移させているのですが、そのログイン画面からログインしてタイムラインに遷移すると、タイムラインで本来実装しているはずのNavigation ControllerやTabbar Controllerが消えてしまいます。

これはおそらく一度呼び出してしまったため、再度呼び出すことができていないのだと理解しています。

今回の質問ではそもそも、ログイン画面を作成する際にどこでどのように判定してどのように遷移すればタイムラインのようなメイン画面でNavigationControllerなどが表示されるのかを知りたいです。
おすすめの方法を共有していただければと思います。

一応ちんぷんかんぷんなことをしているかもしれませんが、わからないなりに試してみたことを下記に記させていただきます。

###試したこと

まず試したのは、タイムラインのクラスファイルのviewDidLoadやviewWillAppear内でログイン判定するのではなく、AppDelegateのdidFinishLaunchingWithOptions内で判定してみました。
これは下記リンクページを参考にさせていただきました。
https://qiita.com/KIKUMA/items/8254ff209890393c708b

この判定でログインログアウトを判定し、ログインしていたらタイムラインに、していなかったらログイン画面に遷移することはできました。
しかしやはり、この呼び出し方を使用してもログインしてタイムラインに遷移するとnavigation類は表示されません。

swift

1 //ユーザーがいない場合ログイン画面に遷移 2 if UserDefaults.standard.object(forKey: "check") == nil{ 3 //windowを生成 4 self.window = UIWindow(frame: UIScreen.main.bounds) 5 //Storyboardを指定 6 let storyboard = UIStoryboard(name: "Main", bundle: nil) 7 //Viewcontrollerを指定 8 let initialViewController = storyboard.instantiateViewController(withIdentifier: "login") 9 //rootViewControllerに入れる 10 self.window?.rootViewController = initialViewController 11 //表示 12 self.window?.makeKeyAndVisible() 13 }else{ 14 //ユーザーがいる場合Storyboardでチェックの入っているIs Initial View Controllerに遷移する 15 }

###試したこと

次に試したのは下記動画で説明されていた方法です。
https://www.youtube.com/watch?v=uETyLoAaJVM
新しいクラスを作っているだけで、ほとんど先ほどのものと違わないのかなと思っています。
とにかくこれでも上手く実装することはできませんでした。

###試したこと
次に、問題は判定のタイミングではなくて、ログイン画面からの遷移の方法なのかもしれないと考え、インターネット上で見つけた遷移方法を色々試しました。

swift

1// ログイン成功した時 2UserDefaults.standard.set("checked", forKey: "check") 3let vc = ViewController() 4self.navigationController?.pushViewController(vc, animated: true) 5// これは何も起こらず(遷移もできませんでした)

swift

1// ログイン成功した時 2let storyboard: UIStoryboard = self.storyboard! 3let nextView = storyboard.instantiateViewController(withIdentifier: "timeline") 4present(nextView, animated: true, completion: nil) 5// 遷移はできましたがNavigation類は表示されませんでした。

###補足情報(言語/FW/ツール等のバージョンなど)

使用しているもの
・Swift4
・Xcode Version 9.0
・Firebase
・見た目の作成や大体の画面遷移はコードではなくStoryBoard上で行っています。

何卒よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

window.rootViewControllerを差し替えるトリッキーな方法ではなく、タイムラインの上にモーダルでログイン画面を表示させたほうが良いと思います。

【追記】

一応、現在の問題点(らしきもの)を書いておくと、ログイン画面後は本来のInitial ViewControllerであるNavigationControllerに遷移しないといけません。

最後のコードで、timelineをNavigationControllerにすればうまくいくと思います。

投稿2017/10/19 00:37

編集2017/10/19 01:01
fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問