炊きたてのご飯が食べたい

定時に帰れるっていいね。自宅勤務できるっていいね。子どもと炊きたてのご飯が食べられる。アクトインディでは積極的にエンジニアを募集中です。

Swift2 - textField の値が入力済みかどうかで登録ボタンを押せるようにする


会員登録画面などで nickName を入力したら、登録ボタンを押せるようにして、空だったらボタンを押せなくするような対応です。

  1. isValidated (バリデーション OK )を管理する変数を用意し didSet で saveButton を活性化させたり、非活性にしたりする
  2. 前後の余白は不要なので stringByTrimmingCharactersInSet で余白を考慮しないようにする
class RegisterViewController: UIViewController, UITextFieldDelegate {
    @IBOutlet weak var nameTextField: UITextField!
    @IBOutlet weak var saveButton: UIButton!
    
    private var isValidated = false {
        didSet {
            if self.isValidated {
                self.saveButton.enabled = true
                self.saveButton.alpha = 1.0
            } else {
                self.saveButton.enabled = false
                self.saveButton.alpha = 0.6
            }
        }
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        self.initialize()
    }
    
    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        self.switchingSaveButton()
    }

    @IBAction func save() {
        // 前後の余白は不要なので trim する
        let name = self.nameTextField.text.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())
        // name を使って何か処理をする
    }
    
    func switchingSaveButton() {
        guard let value = self.nameTextField.text else {
            self.isValidated = false
            return
        }
        // 前後の余白は trim して判定する
        let name = value.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())
        if name.isEmpty {
            self.isValidated = false
        } else {
            self.isValidated = true
        }
    }

    // MARK: private method
    private func initialize() {
        self.nameTextField.delegate = self
        // TextField の Delegate で変更を検知する方法もありますが .EditingChanged を設定する方が楽なのでこちらでいつも検知してます
        self.nameTextField.addTarget(self, action: #selector(self.switchingSaveButton), forControlEvents: .EditingChanged)
        self.isValidated = false
    }
}