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

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

ただいまの
回答率

88.91%

UITextFieldへの入力がシミュレーター上でできません

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 167

1101hiroki_n

score 4

UITextFieldへ入力ができません。

シミュレーター上でのTextFieldへのキーボード入力ができません。(実機テストはまだです。)

書籍検索アプリでStoryboardはほとんど利用していません。

画面構造は、上部にUIButtonクラスを拡張したMainCenterButtonクラスで作成した検索ボタンが配置されていて、
UIScrollView上のUIViewへ書籍名や著者名などの入力欄をappendMainInputs()メソッドでループ処理で配置しています。

入力欄はUILabelを拡張したMainInputLabelクラスとUITextfFieldを拡張したMainInputTextFieldクラスから成ります。

問題が起こっているViewController

class SearchViewController: UIViewController {
    //検索ボタンの上下空白
    private let buttonVerticalMargin: CGFloat = 60.0

    //APIのための構造体
    struct searchingBookInfo {
        var title: String?
        var authors: [String?]
        var publisher: String?
        var edition: String?
        var condition: String?
        var priceUpperLimit: String?
        var ISBNCode: String?
    }

    //入力欄ひとつ分を表す構造体
    struct MainInputStruct {
        var label: MainInputLabel
        var textField: MainInputTextField
        var labelText: String
        var placeholderText: String
        var keyboardType: Int = 0
    }

    //入力欄UIのインスタンス郡
    private let titleInputLabel: MainInputLabel = MainInputLabel()
    private let titleInputTextField: MainInputTextField = MainInputTextField()

    private let authorInputLabel: MainInputLabel = MainInputLabel()
    private let authorInputTextField: MainInputTextField = MainInputTextField()

    private let publisherInputLabel: MainInputLabel = MainInputLabel()
    private let publisherInputTextField: MainInputTextField = MainInputTextField()

    private let editionInputLabel: MainInputLabel = MainInputLabel()
    private let editionInputTextField: MainInputTextField = MainInputTextField()

    private let conditionInputLabel: MainInputLabel = MainInputLabel()
    private let conditionInputTextField: MainInputTextField = MainInputTextField()

    private let upperLimitInputLabel: MainInputLabel = MainInputLabel()
    private let upperLimitInputTextField: MainInputTextField = MainInputTextField()

    private let isbnCodeInputLabel: MainInputLabel = MainInputLabel()
    private let isbnCodeInputTextField: MainInputTextField = MainInputTextField()

    private let searchButton: MainCenterButton = MainCenterButton()

    @objc private func searchButtonEvent(_ sender: MainCenterButton) {
        //検索ボタン押下処理
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        //入力欄の配置ViewとScrollView
        let searchPageScrollView: UIScrollView = UIScrollView()
        self.view.addSubview(searchPageScrollView)
        searchPageScrollView.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            searchPageScrollView.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 0.0),
            searchPageScrollView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: 0.0),
            searchPageScrollView.rightAnchor.constraint(equalTo: self.view.rightAnchor, constant: 0.0),
            searchPageScrollView.leftAnchor.constraint(equalTo: self.view.leftAnchor, constant: 0.0),
        ])

        let searchPageContentView: UIView = UIView(frame: CGRect(x:0,y:0,width:0.0,height: 0.0))
        searchPageScrollView.addSubview(searchPageContentView)
        searchPageContentView.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            searchPageContentView.bottomAnchor.constraint(equalTo: searchPageScrollView.contentLayoutGuide.bottomAnchor),
            searchPageContentView.leadingAnchor.constraint(equalTo: searchPageScrollView.contentLayoutGuide.leadingAnchor),
            searchPageContentView.topAnchor.constraint(equalTo: searchPageScrollView.contentLayoutGuide.topAnchor),
            searchPageContentView.widthAnchor.constraint(equalToConstant: searchPageContentView.frame.width),
            searchPageContentView.trailingAnchor.constraint(equalTo: searchPageScrollView.contentLayoutGuide.trailingAnchor),
        ])

        NSLayoutConstraint.activate([
            searchPageScrollView.contentLayoutGuide.bottomAnchor.constraint(equalTo: searchPageContentView.bottomAnchor)
        ])

        //検索ボタン
        searchButton.setTitle("検索", for: UIControl.State.normal)
        searchButton.addTarget(self, action: #selector(searchButtonEvent(_:)), for: UIControl.Event.touchUpInside)
        self.view.addSubview(searchButton)
        searchButton.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            searchButton.centerXAnchor.constraint(equalTo: self.view.centerXAnchor),
            searchButton.topAnchor.constraint(equalTo: self.view.topAnchor, constant: buttonVerticalMargin),
            searchButton.heightAnchor.constraint(equalToConstant: 60.0),
            searchButton.widthAnchor.constraint(equalTo: self.view.widthAnchor, multiplier: 0.86),
        ])

     //入力欄構造体MainInputStructの配列
        let mainInputs:[MainInputStruct] = [
            MainInputStruct(label: titleInputLabel, textField: titleInputTextField, labelText: "タイトル・書籍名", placeholderText: "タイトル・書籍名を入力"),
            MainInputStruct(label: authorInputLabel, textField: authorInputTextField, labelText: "筆者・訳者", placeholderText: "筆者・訳者名を入力"),
            MainInputStruct(label: publisherInputLabel, textField: publisherInputTextField, labelText: "出版社", placeholderText: "出版社名を入力"),
            MainInputStruct(label: editionInputLabel, textField: editionInputTextField, labelText: "版数", placeholderText: "版数を入力", keyboardType: UIKeyboardType.numberPad.rawValue),
            MainInputStruct(label: conditionInputLabel, textField: conditionInputTextField, labelText: "状態", placeholderText: "書籍の状態を選択"),
            MainInputStruct(label: upperLimitInputLabel, textField: upperLimitInputTextField, labelText: "価格上限", placeholderText: "値段の上限を入力", keyboardType: UIKeyboardType.numberPad.rawValue),
            MainInputStruct(label: isbnCodeInputLabel, textField: isbnCodeInputTextField, labelText: "ISBNコード", placeholderText: "ISBNコードを入力"),
        ]

        //appendMainInputs()メソッドで配置
        self.appendMainInputs(structArray: mainInputs, target: searchPageContentView.topAnchor, firstConstant: (buttonVerticalMargin*2 + 60.0), appendTargetView: searchPageContentView)
        NSLayoutConstraint.activate([
            searchPageContentView.heightAnchor.constraint(equalToConstant: 1200.0),
        ])
    }

    private func appendMainInputs(structArray inputs : [MainInputStruct], target targetAnchor: NSLayoutYAxisAnchor, firstConstant:CGFloat = 30.0, constant:CGFloat = 30.0, appendTargetView: UIView) {
        var constantLength : CGFloat = firstConstant
        var topTargetAnchor : NSLayoutYAxisAnchor = targetAnchor
        for (index, input) in inputs.enumerated() {
            if(index > 0) {
                constantLength = constant
            }
            input.label.text = input.labelText
            input.label.translatesAutoresizingMaskIntoConstraints = false
            appendTargetView.addSubview(input.label)
            NSLayoutConstraint.activate([
                input.label.leftAnchor.constraint(equalTo: appendTargetView.leftAnchor, constant: 9.0),

                input.label.topAnchor.constraint(equalTo: topTargetAnchor, constant: constantLength),
            ])
            input.textField.placeholder = input.placeholderText
            input.textField.keyboardType = UIKeyboardType.asciiCapable
            input.textField.translatesAutoresizingMaskIntoConstraints = false
            appendTargetView.addSubview(input.textField)
            NSLayoutConstraint.activate([
                input.textField.leftAnchor.constraint(equalTo: appendTargetView.leftAnchor),
                input.textField.widthAnchor.constraint(equalTo: self.view.widthAnchor),
                input.textField.heightAnchor.constraint(equalToConstant: 44.0),

                input.textField.topAnchor.constraint(equalTo: input.label.bottomAnchor, constant: 6.0),
            ])
            if(index == inputs.count) {
                NSLayoutConstraint.activate([
                    input.textField.bottomAnchor.constraint(equalTo: appendTargetView.bottomAnchor, constant: 0.0)
                ])
            }

            topTargetAnchor = input.textField.bottomAnchor
        }
    }
}

試したこと

Hardware > Connect Hardware Keyboardはチェック済みです。
Simulatorの再起動とmacの再起動は試しました。

環境

Xcode11.3

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • eytyet

    2019/12/29 17:31 編集

    テキストフィールド上をタップしても反応してくれないのですね。
    1) MainInputTextFieldの中で、isUserInteractionEnabledをfalseにはしていないですよね。MainInputTextFieldのコードは開示可能ですか?
    2) 他の見えないUIViewが上にいて邪魔をしているというのがよくあるケースです。Debug View Hierarchyを表示して他のビューが邪魔をしてないか調べてみてはどうでしょうか。

    キャンセル

  • 1101hiroki_n

    2019/12/30 12:58 編集

    こちらMainInputTextField.swiftです
    ___
    import UIKit

    class MainInputTextField: UITextField {
    @IBInspectable var padding: CGPoint = CGPoint(x: 9.0, y: 0.0)

    override func draw(_ rect: CGRect) {
    self.layer.backgroundColor = CGColor(srgbRed: 247/255, green: 247/255, blue: 247/255, alpha: 1.0)
    self.layer.borderWidth = 1.0
    self.layer.borderColor = CGColor(srgbRed: 234/255, green: 234/255, blue: 234/255, alpha: 1.0)
    self.minimumFontSize = 16.0
    self.isUserInteractionEnabled = true
    self.textColor = UIColor.init(red: 43/255, green: 43/255, blue: 43/255, alpha: 1.0)

    super.draw(rect)
    }

    override func textRect(forBounds bounds: CGRect) -> CGRect {
    return bounds.insetBy(dx: self.padding.x, dy: self.padding.y)
    }
    override func editingRect(forBounds bounds: CGRect) -> CGRect {
    return bounds.insetBy(dx: self.padding.x, dy: self.padding.y)
    }
    override func placeholderRect(forBounds bounds: CGRect) -> CGRect {
    return bounds.insetBy(dx: self.padding.x, dy: self.padding.y)
    }
    }
    ___

    (1)のご指摘に関して、isUserInteractionEnabledはtrueで明記していました。
    (2)でいただいたご指摘を受け確認したところ、特に悪さをしているviewは見当たりませんでした。

    キャンセル

  • 1101hiroki_n

    2019/12/30 13:19

    MainInputTextFieldとsearchPageContentView、searchPageContentViewとsearchPageScrollViewの間の制約の掛け方に問題があったようです。解決いたしました。

    eytyet様、ご相談に応じていただきありがとうございました。

    キャンセル

回答 1

check解決した方法

0

MainInputTextFieldとsearchPageContentView、searchPageContentViewとsearchPageScrollViewの間の制約の掛け方に問題があったようです。

MainInputTextFieldのwidthAnchorをsearchPageContentViewのwidthAnchorに、
searchPageContentViewのwidthAnchoをsearchPageScrollViewのwidthAnchorに設定したところ動作しました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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