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

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

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

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

Swift

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

Q&A

解決済

1回答

666閲覧

【Swift,Xcode】次回以降のログインをスキップできない

nekokichi

総合スコア54

Xcode

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

Swift

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

0グッド

0クリップ

投稿2018/10/06 10:24

アプリを起動したら、下記のログイン画面が表示され、

イメージ説明

1文字でも入力してログインを押せば、次画面に遷移します。

逆に、textFieldになにも入力せずにログインを押せば、
「ユーザー名を入力してください」
とポップアップが出ます。

入力したユーザー名はUserDefaultsに保存しているので、

swift

1let ud = UserDefaults.standard 2 3//ユーザー名をUDに保存 4ud.set(textField.text, forKey: "userName") 5 6//画面遷移 7performSegue(withIdentifier: "goTimeLine", sender: nil)

次回以降のログインは省略されるようになっています。

swift

1 override func viewWillAppear(_ animated: Bool) { 2 super.viewWillAppear(animated) 3 4 //もしユーザー名が保存されてるなら 5 if let username = UserDefaults.standard.object(forKey: "userName") { 6 performSegue(withIdentifier: "goTimeLine", sender: nil) 7 } 8 9 }

ですが、シミュレータと実機で何度も起動すると、ログイン画面は省略されずに、初回起動時と同じようにユーザー名を入力しないと進めません。

つまり、”次回以降のログイン画面は省略”が実装できていないのです。

forKeyは確認しましたし、viewWillAppearなので初回以降のログイン時に実行されるはずです。

どこが問題かご指摘いただきたいです。

swift

1import UIKit 2import EMAlertController 3 4class ViewController: UIViewController,UITextFieldDelegate { 5 6 7 @IBOutlet weak var textField: UITextField! 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 12 if let username = UserDefaults.standard.object(forKey: "userName") { 13 performSegue(withIdentifier: "goTimeLine", sender: nil) 14 } 15 16 textField.delegate = self 17 18 } 19 20 override func viewWillAppear(_ animated: Bool) { 21 super.viewWillAppear(animated) 22 23 //もしユーザー名が保存されてるなら 24 if let username = UserDefaults.standard.object(forKey: "userName") { 25 performSegue(withIdentifier: "goTimeLine", sender: nil) 26 } 27 28 } 29 30 @IBAction func login(_ sender: Any) { 31 if textField.text != "" { 32 33 let ud = UserDefaults.standard 34 35 //ユーザー名をUDに保存 36 ud.set(textField.text, forKey: "userName") 37 38 //画面遷移 39 performSegue(withIdentifier: "goTimeLine", sender: nil) 40 41 } else { 42 43 //アラート 44 let alert = EMAlertController(title: "ユーザー名を入力してください", message: "") 45 //アクション 46 let action = EMAlertAction(title: "OK", style: .cancel) 47 //アラートにアクションを追加する 48 alert.addAction(action: action) 49 //アラートを表示 50 present(alert, animated: true, completion: nil) 51 52 } 53 } 54 55 //画面をタップするとキーボードが閉じる 56 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 57 textField.resignFirstResponder() 58 } 59 60 61} 62

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

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

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

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

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

guest

回答1

0

ベストアンサー

viewWillAppearではなくviewDidAppearでやってみてください。
viewWillAppearだとビューが完全に表示されていない状態なので、performSegue で別ビューに切り替えることができないと思いますよ。

投稿2018/10/06 14:54

xenbeat

総合スコア4258

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問