【Xcode】UserDefaultsでログイン機能 - 本格版

前回の記事で、UserDefaultsで簡易的なログイン機能を実装する方法を紹介しました。

 

しかし、ユーザー名に関係なく次回以降は無条件でログインできてしまう欠点がありました。

 

今回は、初回時に入力したユーザー名を入力しない限りログインできない仕組みをご紹介します。

 

 

プロセス

 

既に新規登録したか?

↓→してないなら②へ

したなら①へ

 

①既に新規登録した

textFieldの入力値が正しいか?

↓→正しい→ログイン成功

間違い

アラートで再入力を要求

 

②まだしてない

 

textFieldに入力したか?

↓→した→新規登録完了

してない

アラートで再入力を要求

 

ソースコード

import UIKit
import EMAlertController

class ViewController: UIViewController,UITextFieldDelegate {
    
    
    @IBOutlet weak var textField: UITextField!
    @IBOutlet weak var loginButton: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        textField.delegate = self
        
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        //もしユーザー名が保存されてるなら
        if let _ = UserDefaults.standard.object(forKey: "userName") {
            //ボタンの文字を"ログイン"に変更
            loginButton.setTitle("ログイン", for: .normal)
        //保存されてないなら
        } else {
            loginButton.setTitle("会員登録", for: .normal)
        }
        
    }

    @IBAction func login(_ sender: Any) {
        
        //既にログインしてるなら
        if let _ = UserDefaults.standard.object(forKey: "userName") {
            
            //もし入力した値が保存したユーザー名と同じなら
            if textField.text ==  UserDefaults.standard.object(forKey: "userName") as? String {
                
                //遷移
                performSegue(withIdentifier: "goTimeLine", sender: nil)
                
            //違うなら
            } else {
                
                //アラート作成
                let alert = EMAlertController(title: "ユーザー名が正しくありません。", message: "")
                //アクション作成
                let action = EMAlertAction(title: "OK", style: .cancel)
                //アラートにアクションを追加する
                alert.addAction(action: action)
                //アラートを表示
                present(alert, animated: true, completion: nil)
                
            }
            
        //新規登録する場合
        } else {
            
            //もしユーザー名が記入されてるなら
            if textField.text != "" {
                
                //UserDefaultsの変数
                let ud = UserDefaults.standard
                //ユーザー名をUDに保存
                ud.set(textField.text, forKey: "userName")
                //画面遷移
                performSegue(withIdentifier: "goTimeLine", sender: nil)
                
            //もしユーザー名が記入されてないなら
            } else {
                
                //アラート
                let alert = EMAlertController(title: "ユーザー名を入力してください", message: "")
                //アクション
                let action = EMAlertAction(title: "OK", style: .cancel)
                //アラートにアクションを追加する
                alert.addAction(action: action)
                //アラートを表示
                present(alert, animated: true, completion: nil)
                
            }
            
        }
        
    }
    
    //画面をタップするとキーボードが閉じる
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        textField.resignFirstResponder()
    }
    
    
}