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

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

ただいまの
回答率

90.51%

  • Swift

    7269questions

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

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 178
退会済みユーザー

退会済みユーザー

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

モーダルビューからデータを受け取るドキュメントを参考に、
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)

    }


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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/22 11:55

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

    キャンセル

  • 2018/06/22 12:00

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

    キャンセル

  • 2018/06/22 12:07

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

    修正します。

    キャンセル

  • 2018/06/22 12:33 編集

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

    キャンセル

  • 2018/06/22 12:42

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

    キャンセル

  • 2018/06/22 12:46

    同じような質問がありました。
    https://teratail.com/questions/91004
    これを参考にして下さい。

    キャンセル

  • 2018/06/22 13:35 編集

    ありがとうございます。教えていただいたリンク先のtextFieldDidEndEditingも以前から試していたのですが、反応がありません。


    本文のコード(ModalViewController)のpushChange内の条件式を消して、
    下記のメソッドを追記しても、常にタップが可能のままになってしまいます。

    func textFieldDidEndEditing(_ textField: UITextField) {
    if textField.text == "" {
    changeButton.isEnabled = false
    } else {
    changeButton.isEnabled = true
    }
    }

    キャンセル

  • 2018/06/22 13:42

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

    キャンセル

  • 2018/06/22 13:50

    textFieldDidEndEditingは呼ばれていますか?

    キャンセル

  • 2018/06/22 13:52

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

    キャンセル

  • 2018/06/22 14:26

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

    キャンセル

  • 2018/06/22 17:40

    あれ、デリゲートメソッドじゃなかったっけ‥。

    Notification使わないとダメっぽいです。
    https://qiita.com/koogawa/items/b99304997c7fbd3e8530
    @koogawa さん、ありがとうw

    キャンセル

  • 2018/06/23 00:35

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

    キャンセル

+1

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

 let one = 1
 let text = textField.text!

 if text.count > one {
     changeButton.isEnabled = true
 } else {            
     changeButton.isEnabled = false
 }

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/22 11:43 編集

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

    キャンセル

  • 2018/06/22 11:57 編集

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

    キャンセル

  • 2018/06/23 00:44

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

    キャンセル

+1

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

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

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

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

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

changeButton.isEnabled = text.count > one

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/22 11:39

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

    キャンセル

  • 2018/06/22 11:57

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

    キャンセル

  • 2018/06/23 00:42

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

    キャンセル

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

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    swift Button タップ スワイプ

    現在、タップとスワイプの二つを一つのボタンで行おうとしています。 ボタンをタップしたらUIViewを出して ボタンをスワイプしたらそのボタンが指に沿って移動する・・・

  • 解決済

    swift スワイプ 座標判定 XY

    前提・実現したいこと 毎度毎度すみません・・・ 現在swiftで作っていて、場所Aにオブジェクトをスワイプし オブジェクトが場所Aに少しでも入っていたら、 オブジェクトを消

  • 受付中

    classからUIButtonを作成したい

    viewcontrollerに複数のボタンを作成したいため、classを使って制御をしようと思いこのサイトを参考に作成しましたが、 self.view.addSubview(my

  • 解決済

    Swift3でボタンをタップした時にPickerViewをしたから出す方法

    前提・実現したいこと タイトル通りなのですが、ボタンをタップした時にピッカーが下から出てくるようにしたいです。 TextFieldをタップした時にピッカーが下から出るように

  • 解決済

    Swift3 カスタムボタンを使ってゴミ箱を作りたい

    Swift3でiOSアプリを作っています。 ボタンを生成して動かす事は出来ました。 ボタンをゴミ箱まで移動させて、そのボタンを削除したいと思います。 そこで移動中のカスタ

  • 解決済

    【Swift】Viewの座標位置の変換がうまくいかない。

    前提・実現したいこと UIViewに枠線をつけ画面中央に配置しており、その中に収まっている部分のUIImagewのimageを取得したいのです。 Viewに収まっている部分をc

  • 受付中

    Labelの座標について

    パスワードを入力して間違っていた時にLabelを「ブルブル」と横に振動させたいのですが、どのようにすればいいですか?

  • 受付中

    カメラアクセスと写真のアップロードができない

    作ったアプリでカメラアクセスと写真のアップロードができません。 Xcodeから自分のiPhoneでエミュレータを起動したのですが Camera access ボタンとPhoto

同じタグがついた質問を見る

  • Swift

    7269questions

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