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

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

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

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

Q&A

解決済

3回答

1450閲覧

モーダルビューからデータを受け取る時、文字数を判定する

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

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

0グッド

0クリップ

投稿2018/06/21 14:33

編集2018/06/22 08:26

ストーリーボード未使用で作っています。

モーダルビューからデータを受け取るドキュメントを参考に、
ModalViewControllerにあるchangeButtonがタップされ、
UITextField.textの文字が1文字を超えていれば、
下記のコードの様に.isEnabled = trueと判定したいのですが、できていません。

コードはviewDidLoad内に書いています。

let one = 1 let text = textField.text! if text.count > one { changeButton.isEnabled = true } else if text.count < one { changeButton.isEnabled = false }

他にviewDidLoad内には

textField.delegate = self textField.text = ""

などを用意し、プロトコルとしてUITextFieldDelegateも追加しています。

他にfuncを作り、changeButtonの前に判定などが必要なのでしょうか?試していますが分かりません。
見ていただければとても助かります。よろしくお願いします。

6/22追記 参考ドキュメントに少し手を加えた下記コードを追加しました。

import UIKit class HomeViewController: UIViewController { var textFromModal = "" { didSet { updatelabel(text: textFromModal) } } var textLabel = UILabel() override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .white set() } func set() { textLabel = UILabel(frame: CGRect(x: 0, y: 0, width: view.bounds.width - 20, height: 30)) textLabel.center = CGPoint(x: view.center.x, y: view.center.y - 50) textLabel.textAlignment = .center textLabel.text = "" view.addSubview(textLabel) // let modalButton = UIButton(frame: CGRect(x: 0, y: 0, width: 100, height: 30)) modalButton.center = view.center modalButton.setTitle("開く", for: .normal) modalButton.setTitleColor(UIColor.blue, for: .normal) modalButton.addTarget(self, action: #selector(pushModal(sender:)), for: .touchUpInside) view.addSubview(modalButton) } @objc func pushModal(sender:UIButton) { let modal = ModalViewController(nibName: nil, bundle: nil) modal.modalTransitionStyle = .crossDissolve present(modal, animated: true, completion: nil) } func updatelabel(text: String) { textLabel.text = "I'm, (text)" } }
import UIKit class ModalViewController: UIViewController, UITextFieldDelegate { var changeButton = UIButton() var textField = UITextField() override func viewDidLoad() { super.viewDidLoad() set() } func set() { view.backgroundColor = .gray let cancelButton = UIButton(frame: CGRect(x: 0, y: 0, width: 100, height: 30)) cancelButton.center = CGPoint(x: view.center.x - 100, y: view.center.y) cancelButton.setTitle("キャンセル", for: .normal) cancelButton.setTitleColor(UIColor.black, for: .normal) cancelButton.addTarget(self, action: #selector(pushDismiss(sender:)), for: .touchUpInside) view.addSubview(cancelButton) // changeButton = UIButton(frame: CGRect(x: 0, y: 0, width: 100, height: 30)) changeButton.center = CGPoint(x: view.center.x + 100, y: view.center.y) changeButton.setTitle("変更", for: .normal) changeButton.setTitleColor(UIColor.black, for: .normal) changeButton.addTarget(self, action: #selector(pushChange(sender:)), for: .touchUpInside) view.addSubview(changeButton) //111 textField.delegate = self textField.text = "" textField = UITextField(frame: CGRect(x: 0, y: 0, width: view.bounds.width - 20, height: 30)) textField.center = CGPoint(x: view.center.x, y: view.center.y + 50) textField.placeholder = "input your name" textField.backgroundColor = .white view.addSubview(textField) } @objc func pushDismiss(sender:UIButton) { self.dismiss(animated: true, completion: nil) } //改行ボタンが押された際に呼ばれる func textFieldShouldReturn(_ textField: UITextField) -> Bool { // 改行ボタンが押されたらKeyboardを閉じる処理. textField.resignFirstResponder() if textField.text == "" { changeButton.isEnabled = false } else { changeButton.isEnabled = true } return true } //UITextFieldが編集された後に呼ばれる func textFieldDidEndEditing(_ textField: UITextField) { if textField.text == "" { changeButton.isEnabled = false } else { changeButton.isEnabled = true } } @objc func pushChange(sender:UIButton) { textField.resignFirstResponder() //強制ダウンキャスト let originVc = presentingViewController as! HomeViewController originVc.textFromModal = textField.text! self.dismiss(animated: true, completion: nil) } }

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

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

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

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

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

guest

回答3

0

ベストアンサー

viewDidLoadは、ViewControllerの読み込み時に実行されるところです。
入力値を判定したいのであれば、dismissButtonのタップ処理(参考記事で言うとpushDismiss(sender:)でしょうか?)の中に判定コードを書いて下さい。

投稿2018/06/22 01:15

fuzzball

総合スコア16731

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

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

退会済みユーザー

退会済みユーザー

2018/06/22 02:55

fuzzball様 ViewControllerについて教えて頂きありがとうございます。 pushDismiss(sender:)内にも書いて以前から試していたのですが、本文の条件式では未入力""でもタップが可能になってしまいます。 実際のコードを追記しましたので、見ていただけないでしょうか?
fuzzball

2018/06/22 03:00

pushDismissの中ではなくpushChangeの中に判定を書いてますが、これで合っているのでしょうか? 質問には「dismissButtonがタップされ〜」と書かれていますが。
退会済みユーザー

退会済みユーザー

2018/06/22 03:07

すみません、参考にして自分で書いたコードではpushChangeが正しいです。 修正します。
fuzzball

2018/06/22 03:34 編集

やりたいことは何なんでしょう?入力があるまでchangeボタンを押せなくしたいのですか?
退会済みユーザー

退会済みユーザー

2018/06/22 03:42

はい。UITextField.textの文字が1文字を超えていれば入力可能となり、 1文字未満だと入力不可の処理を条件式で実現したいです。
退会済みユーザー

退会済みユーザー

2018/06/22 04:37 編集

ありがとうございます。教えていただいたリンク先のtextFieldDidEndEditingも以前から試していたのですが、反応がありません。 本文のコード(ModalViewController)のpushChange内の条件式を消して、 下記のメソッドを追記しても、常にタップが可能のままになってしまいます。 func textFieldDidEndEditing(_ textField: UITextField) { if textField.text == "" { changeButton.isEnabled = false } else { changeButton.isEnabled = true } }
退会済みユーザー

退会済みユーザー

2018/06/22 04:42

本文を現在のコードに修正しました。
fuzzball

2018/06/22 04:50

textFieldDidEndEditingは呼ばれていますか?
fuzzball

2018/06/22 04:52

あぁ、違います。 textFieldDidEndEditing は入力完了時に呼ばれるメソッドです。 入力時は textFieldEditingChanged です。 リンク先回答のコメントを読んで下さい。
退会済みユーザー

退会済みユーザー

2018/06/22 05:26

読んだのですが、textFieldEditingChangedというfuncが予測変換候補に見当たらず分かりません。ストーリーボードを使わずにコードのみで書いているのですが、この場合はtextFieldEditingChangedを使えないのでしょうか。
退会済みユーザー

退会済みユーザー

2018/06/22 15:35

fuzzball様 頂いたドキュメントを参考にして、実現できました。 何度も質問に答えて頂き、ありがとうございました。 おかげで細かい仕組みに触れられてとてもよかったです。
guest

0

changeButtonHomeViewController側で持っているんでしょうか?
だとすれば、
HomeViewController.viewDidLoadだけでなく、

モーダルから文字列が更新された時

// モーダルビューから受け取るテキスト
var textFromModal = "" {
didSet {
// 値が更新されたら、ラベルの内容も更新する
updateLabel(text: textFromModal)
}
}

上記のdidSet内でもchangeButtonの状態を更新する必要があると思います。

ちなみにisEnabledを切り替えるのでしたら自分は↓のような書き方が好きです。

changeButton.isEnabled = text.count > one

こうした更新は関数にまとめておくと良いと思います。

投稿2018/06/22 01:11

takabosoft

総合スコア8356

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

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

退会済みユーザー

退会済みユーザー

2018/06/22 02:39

takabosoft様 changeButtonはModalViewControllerにあります。紛らわしく申し訳ありません。
takabosoft

2018/06/22 02:57

changeButtonのisEnableを更新したい希望のタイミングはdismissButtonをタップした後なのでしょうか?質問文から推察するに、ソフトウェアキーボードでテキストフィールドにテキストを入力している最中に随時変えたいのかなとも思いましたが。
退会済みユーザー

退会済みユーザー

2018/06/22 15:42

まだ色々と自分の理解が及ばないので、 今回は文字が1文字でも入力されていたらisEnableをtrueに、それ以外はfalseにしたかっただけでした。 入力の最中かタップした後かどちらが良いのかまでは考えていませんでしたが、今後細かく設定する際にtakabosoft様の回答を参考にさせて頂きます。 ありがとうございます。
guest

0

条件式の中に、1のときどうするかがないのでは?

swift

1 let one = 1 2 let text = textField.text! 3 4 if text.count > one { 5 changeButton.isEnabled = true 6 } else { 7 changeButton.isEnabled = false 8 } 9

投稿2018/06/21 16:38

編集2018/06/21 16:42
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/06/22 02:44 編集

仰る意味がわかりません。 どこで条件式を発火させればいいのか分からないので、質問させて頂きました。
退会済みユーザー

退会済みユーザー

2018/06/22 03:39 編集

いや発火させる?場所はリンク先に書いてあるのでわかってるものかと。 text.count = 1のとき質問文の条件式ではどこもとおらないけどいいのかな?と。 ん、テキストフィールドとボタンがモーダルに有るのこれ?値の受け渡し関係なくないですか? テキストフィールドの値の変化にからめたいんじゃないのこれ?
退会済みユーザー

退会済みユーザー

2018/06/22 15:44

>>どこもとおらないけどいいのかな?と。 すみません、仰る通りでした。失礼しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問