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

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

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

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

Swift

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

Q&A

解決済

3回答

1608閲覧

Swiftでパスワードが異なるときにボタンを無効にしたい

se_taro

総合スコア6

iOS

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

Swift

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

0グッド

0クリップ

投稿2020/04/22 07:59

編集2020/04/22 08:16

Swiftでアカウントの新規登録画面を作成しています。
パスワード入力欄と再入力欄のパスワードが違うときにボタンを無効にしたいです。
現在のコードではボタンが押せる状態です。printもされていません。
Breakpointも設置してみたのですが、使い方が違うのか、上手く原因がわかりませんでした。
どこが原因なのでしょうか?

Swift

1class RegisterViewController: UIViewController, UITextFieldDelegate { 2 3// 登録ボタン 4 @IBOutlet weak var Button: UIButton! 5 @IBOutlet weak var newname: UITextField! 6 @IBOutlet weak var newmail: UITextField! 7 @IBOutlet weak var newpass: UITextField! 8 @IBOutlet weak var newpass2: UITextField! 9 10 @IBAction func back_button(_ sender: Any) { 11 self.navigationController?.popViewController(animated: true) 12 } 13 14 // 登録ボタン 15 @IBAction func register(_ sender: Any) { 16 17 // https://teachapi.herokuapp.com/sign_up 18 let config: URLSessionConfiguration = URLSessionConfiguration.default 19 20 let session: URLSession = URLSession(configuration: config) 21 22 var urlComponents = URLComponents() 23 urlComponents.scheme = "https" 24 urlComponents.host = "teachapi.herokuapp.com" 25 urlComponents.path = "/sign_up" 26 27 28 let url: URL = urlComponents.url! 29 var req: URLRequest = URLRequest(url: url) 30 req.httpMethod = "POST" 31 req.addValue("application/json", forHTTPHeaderField: "Content-Type") 32 let params:[String:Any] = [ 33 "sign_up_user_params": [ 34 "name": "(newname.text!)", 35 "bio": "a", 36 "email": "(newmail.text!)", 37 "password": "(newpass.text!)", 38 "password_confirmation": "(newpass2.text!)" 39 ] 40 ] 41 func textFieldDidEndEditing(_ textField: UITextField) { 42 if newpass.text == newpass2.text { 43 do{ 44 req.httpBody = try JSONSerialization.data(withJSONObject: params, options: []) 45 }catch{ 46 print(error.localizedDescription) 47 } 48 49 print(req) 50 let task = session.dataTask(with: req) { (data, response, error) in 51 52 do { 53 let json: [String: Any] = try JSONSerialization.jsonObject(with: data!, options: []) as! [String: Any] 54 UserDefaults.standard.set(json["token"], forKey: "token") 55 UserDefaults.standard.synchronize() 56 57 } catch { 58 59 } 60 61 } 62 task.resume() 63 } else { 64 print("パスワードが違います") 65 Button.isEnabled = true 66 } 67 }

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

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

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

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

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

thyda.eiqau

2020/04/22 08:13

そのViewControllerのclass定義部分の最初から (class xxxViewController: UIViewcontroller...の行から) 記載してください。
thyda.eiqau

2020/04/22 08:15

(セキュリティ上などの理由で公開できない部分はマスクするか省くかしていただいてOKです)
se_taro

2020/04/22 08:16

追加しました!
guest

回答3

0

こんなかんじでできますか?

swift

1 2// 初期値をfalseにしておいて、 3override func viewDidLoad() { 4 super.viewDidLoad() 5 Button.isEnabled = false 6} 7 8// 文字列に変化があったときに、条件式を評価して、isEnabledを設定 9func textField(_ textField: UITextField, 10 shouldChangeCharactersIn range: NSRange, 11 replacementString string: String) -> Bool { 12 13   // ここで比較するとだめなのよ。 14 15   DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) { 16 // ここで比較して、isEnabledを更新すればできるかな? 17 self.Button.isEnabled = self.newpass.text == self.newpass2.text 18 } 19 return true 20}

投稿2020/04/22 10:57

編集2020/04/22 11:24
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

textFieldDidEndEditing は入力が確定したときに呼ばれますので、たとえばパスワード確認のフィールドにフォーカス (カーソル) が残った状態で登録ボタンをタップしようとしたときにはまだ判定が実行されずDisabled状態となってしまい、ユーザーフレンドリーではないと思います。
一般的にはNSUserNotificationを使って値が変更された時にバリデーションをかけると思います。

変数名などは一部わかりやすいように変更しています。

swift

1class ViewController: UIViewController { 2 @IBOutlet weak var newNameField: UITextField! 3 @IBOutlet weak var newMailField: UITextField! 4 @IBOutlet weak var newPasswordField: UITextField! 5 @IBOutlet weak var newPasswordConfirmField: UITextField! 6 @IBOutlet weak var registerButton: UIButton! 7 8 var confirmedPassword:String = "" 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 13 [ 14 self.newNameField, 15 self.newMailField, 16 self.newPasswordField, 17 self.newPasswordConfirmField 18 ].forEach { (textField: UITextField?) in 19 NotificationCenter.default.addObserver( 20 self, 21 selector: #selector(textFieldDidChange(_:)), 22 name: UITextField.textDidChangeNotification, 23 object: nil 24 ) 25 } 26 self.registerButton.isEnabled = false 27 } 28 29 // MARK: - Register Button handler 30 @IBAction func register(_ sender: UIButton) { 31 let params:[String:Any] = [ 32 "sign_up_user_params": [ 33 "name": self.newNameField.text ?? "", 34 "bio": "a", 35 "email": self.newMailField.text ?? "", 36 "password": self.confirmedPassword, 37 "password_confirmation": self.confirmedPassword 38 ] 39 ] 40 print("params: (params)") 41 } 42 43 // MARK: - Text Fields did change handler 44 @objc func textFieldDidChange(_ sender: NSNotification) { 45 guard let textField = sender.object as? UITextField else { return } 46 47 // パスワードまたはパスワード確認のフィールドが変更されたときは、互いの値を比較して、 48 // 一致したときのみ `confirmedPassword` に値を格納する 49 if textField.isEqual(self.newPasswordField) || textField.isEqual(self.newPasswordConfirmField) { 50 let password: String = self.newPasswordField.text ?? "" 51 let confirm: String = self.newPasswordConfirmField.text ?? "" 52 self.confirmedPassword = password == confirm ? password : "" 53 } 54 55 // name、email, confirmedPassword がすべて空ではないときのみ、登録ボタンを有効にする 56 let isNameNotEmpty = (self.newNameField.text ?? "").utf8.count > 0 57 let isMailNotEmpty = (self.newMailField.text ?? "").utf8.count > 0 58 let isPasswordNotEmpty = self.confirmedPassword.utf8.count > 0 59 self.registerButton.isEnabled = isNameNotEmpty && isMailNotEmpty && isPasswordNotEmpty 60 } 61}

投稿2020/04/22 09:19

thyda.eiqau

総合スコア2982

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

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

0

func textFieldDidEndEditing(_ textField: UITextField) { return true }

こちらのデリゲートではキーボードが閉じた後にのみ呼び出されるので追加で
編集中に毎回呼び出される下記のデリゲート内でボタンの無効化のコードを追記したら如何でしょうか?
(またボタンを無効化したいならisEnabledはfalseにしたらいいと思います)

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {     return true }

投稿2020/04/22 09:12

hotateman0913

総合スコア40

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問