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

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

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

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

Q&A

解決済

1回答

5039閲覧

UITextFieldのnil判定について。

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

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

0グッド

2クリップ

投稿2018/05/30 06:30

ユーザーの登録内容の変更画面を作っています。

UITextField(userName, place,site)といった項目を用意し、userName.textがnilの場合のみ変更ボタン(saveButton)がタップできないような関数を作っていますが、
userNameが未入力の場合も変更ボタンがタップ可能になってしまう為、困っています。

userNameはnilを許さず、入力必須の項目としたいです。

下記のコードは
キーボードの"Done"をタップして閉じる パターンと、
変更ボタン(saveButton)をダイレクトにタップして閉じる パターンの関数の部分です。

どこかnilでも変更ボタンをタップ可能になっている箇所がありますか? どうぞよろしくお願いします。

//"Done"をタップ キーボード閉じる パターン func textFieldShouldReturn(_ textField: UITextField) -> Bool { //"Done"でtextFieldが閉じる(userName, place, siteなど全て) textField.resignFirstResponder() //TextFieldに入力された値に反応して、その値を習得。 NotificationCenter.default.addObserver(self, selector: #selector(ModalViewController.changeNotifyTextField(sender:)), name: NSNotification.Name.UITextFieldTextDidChange, object: nil) return true } //senderの中に 変更があったUITextFieldが入ってくる感じ @objc public func changeNotifyTextField (sender: NSNotification) { guard let textView = sender.object as? UITextField else { return } if userName.text != nil { saveButton.isEnabled = userName.text != "" //ターゲット saveButton.addTarget(self, action: #selector(save(_:)), for: .touchUpInside) } } @objc func save(_ sender: UITapGestureRecognizer) { print("変更ボタン タップ") self.dismiss(animated: true, completion: nil) aaa() }
//saveButtonをダイレクトにタップする パターン @objc func save2(_ sender: UITapGestureRecognizer) { NotificationCenter.default.addObserver(self, selector: #selector(ModalViewController.changeNotifyTextField2(sender:)), name: NSNotification.Name.UITextFieldTextDidChange, object: nil) } //senderの中に 変更があったUITextFieldが入ってくる感じ @objc public func changeNotifyTextField2 (sender: NSNotification) { guard let textView = sender.object as? UITextField else { return } if userName.text != nil { saveButton.isEnabled = userName.text != nil //ターゲット saveButton.addTarget(self, action: #selector(save3(_:)), for: .touchUpInside) } } @objc func save3(_ sender: UITapGestureRecognizer) { saveButton.endEditing(true)         print("タップ") self.dismiss(animated: true, completion: nil) }

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

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

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

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

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

guest

回答1

0

ベストアンサー

初期化時にタップ無効にしていないからタップ出来てしまう、ということではないですかね?
あと、addTargetが何度も呼ばれてしまうのもマズイです。

こんな感じでどうでしょう?

初期化時

swift

1//カラにする 2userName.text = "" 3//タップ無効 4saveButton.isEnabled = false 5//タップ処理を登録 6saveButton.addTarget(self, action: #selector(save(_:)), for: .touchUpInside)

changeNotifyTextFieldの中

swift

1//enable/disableの制御だけ 2saveButton.isEnabled = !(userName.text?.isEmpty ?? true)

補足

nil""(未入力)は別物なのでキチンと区別しましょう。

投稿2018/05/30 06:50

編集2018/05/30 08:05
fuzzball

総合スコア16731

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

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

_Kentarou

2018/05/30 06:53 編集

isEmptyでスッキリしますね。 saveButton.isEnabled = !userName.text.isEmpty
fuzzball

2018/05/30 07:03

あぁ、Objective-Cのクセで‥。 nilも考慮出来てなかったので修正します。
退会済みユーザー

退会済みユーザー

2018/05/30 07:52

ご指摘の通り初期化時にタップ無効が抜けていました。addTargetも1つにまとめ修正し未入力時にタップ無効化できました。 !(userName.text?.isEmpty ?? false)は、isEmptyプロパティがnil(userNameがnil)の場合falseを返す、でしょうか? お二人とも詳しい内容非常に助かります。 ありがとうございます。
fuzzball

2018/05/30 08:10

失礼、そこ ?? false じゃなくて ?? trueでした。 意味としては「userName.text?.isEmpty が nil のときは true を返す」です。(頭に ! (not) が付いているので、最終的には false が返ります)
退会済みユーザー

退会済みユーザー

2018/05/30 08:22

最終的にnilの時はfalseを返すのですね。理解できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問