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

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

ただいまの
回答率

89.99%

inputAccessoryView内にある、UITextViewにフォーカスを当てたい

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 2,818

Yukihiro.Y

score 11

お知恵をお貸しください。

説明が非常に難しいのですが、キーボードにinputAccessoryViewで、表示や非表示になると追随して表示されたり消えるviewを追加します。

inputAccessoryViewのsubviewにUITextViewがあり、そのUITextViewにbecomeFirstResponder()でフォーカスが当たったら、キーボードを表示したく思います。

イメージ説明

この画像にあるself.viewの部分をタップをしたら、inputAccessoryView内のUITextViewにフォーカスが当たった状態にしたいです。

現状では、

let inputTextView = UITextView()

override func viewDidLoad() {

    //inputAccessoryViewにするためのUIViewを作製
    let keyboardAcssView = UIView()
    keyboardAcssView.frame = CGRectMake(0, 0, self.view.frame.width, 40)
    keyboardAcssView.backgroundColor = UIColor.darkGrayColor()
    //入力対象のUITextViewを作製追加
    inputTextView = UITextView()
    inputTextView.frame = CGRectMake(20,5,310,30)
    inputTextView.backgroundColor = UIColor.whiteColor()

    //self.viewにタップイベント追加
    let tapGesture = UITapGestureRecognizer(target: self,action:#selector(tapGes(_:)))
    self.scrollView.addGestureRecognizer(tapGesture)
}

  //タップされて呼ばれる関数
func tapGes(sender:UITapGestureRecognizer){
        //フォーカスを与える。
        inputTextView.becomeFirstResponder()   
}


重ねてになりますが、inputAccessoryView内にあるUITextFieldにフォーカスを与えたいのですが、現状のコードでは、キーボードすら表示されません。
なんとかいい方法がないでしょうか?

できれば、いろいろ面倒なのでinputAccessoryViewを使って実装したいのですが....

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

画面に存在していないTextFieldにbecomeFirstResponder()を設定できないのでキーボードすら表示されないということですね。

回避策を用いてやりたいという事ができたので下記に載せておきます。

① ダミーのテキストフィールドを画面に乗せておく(hiddenでかくしてOK)
② キーボードが表示された後に呼ばれる通知を登録
③ 画面をタップした時のイベントでダミーのテキストフィールドに対してbecomeFirstResponder()を呼び出します。
④ キーボードが表示された後のイベントでフォーカスをinputTextViewに切り替える。

以上です、参考にしてみてください。

import UIKit

class ViewController: UIViewController, UITextFieldDelegate, UITextViewDelegate {

    var inputTextView = UITextView()
    @IBOutlet weak var dummyTextField: UITextField!

    override func viewDidLoad() {

        dummyTextField.hidden = true

        // キーボード表示後に呼ばれる通知を登録
        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.didShowKeyboardNotification(_:)), name: UIKeyboardDidShowNotification, object: nil)

        //inputAccessoryViewにするためのUIViewを作製
        let keyboardAcssView = UIView()
        keyboardAcssView.frame = CGRectMake(0, self.view.frame.size.height - 40, self.view.frame.width, 40)
        keyboardAcssView.backgroundColor = UIColor.darkGrayColor()

        //入力対象のUITextViewを作製追加
        inputTextView = UITextView()
        inputTextView.frame = CGRectMake(20,5,310,30)
        inputTextView.backgroundColor = UIColor.whiteColor()
        keyboardAcssView.addSubview(inputTextView)

        dummyTextField.delegate = self
        dummyTextField.inputAccessoryView = keyboardAcssView

        // self.viewにタップイベント追加
        let tapGesture = UITapGestureRecognizer(target: self,action:#selector(tapGes(_:)))
        self.view.addGestureRecognizer(tapGesture)
    }

    deinit {
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }

    // タップされて呼ばれる関数
    func tapGes(sender:UITapGestureRecognizer){
        dummyTextField.becomeFirstResponder()
    }

    func didShowKeyboardNotification(notification: NSNotification) {
        inputTextView.becomeFirstResponder()
    }
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/07/29 16:27

    回答ありがとうございます。やはりview外に隠したtextViewに一度フォーカスを与える方法しかないようですね。

    コードを参考に実装させていただきます。

    キャンセル

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

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