swiftでuitextviewに完了ボタンを設置してキーボードを閉じる方法

はじめに

uitextfieldでは基本的に改行がないので、改行を押されたらキーボードを閉じる処理を実装すればよかったのですが、uitextviewの場合は改行も当然入力したいと思われるので同じ方法が使えませんでした。

で、今回はキーボードの上に別途に完了ボタンを設置してそれを押されたらキーボードを閉じるという実装を行いました。safariでテキストボックスを選択したときと同じような挙動になります。

f:id:yoppy0066:20150617033357p:plain
完成イメージはこんな感じになります

実装方法

1. UITextViewDelegateをデリゲートします

class SampleViewController: BaseViewController, UITextViewDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        ・・・
    }
}


2. UiTextViewを作成して完了ボタンを追加します

class SampleViewController: BaseViewController, UITextViewDelegate {

    var textView: UITextView!

    override func viewDidLoad() {

        ・・・

        textView = UITextView()
        textView.frame = CGRectMake(xTextView, yTextView, widthTextView, heightTextView)
        
        var accessoryView = UIView(frame: CGRectMake(0, 0, widthMax, 44))
        accessoryView.backgroundColor = UIColor.whiteColor()
        var closeButton = UIButton(frame: CGRectMake(xCloseButton, yCloseButton, 100, 30))
        closeButton.setTitle("完了", forState: UIControlState.Normal)
        closeButton.setTitleColor(UIColor.blackColor(), forState: UIControlState.Normal)
        closeButton.contentHorizontalAlignment = UIControlContentHorizontalAlignment.Right
        closeButton.addTarget(self, action: "onClickCloseButton:", forControlEvents: .TouchUpInside)
        accessoryView.addSubview(closeButton)
        textView.inputAccessoryView = accessoryView
        
        self.view.addSubview(textView)
    }
}


3. 完了ボタンを押された時にキーボードを閉じる処理を実装します

class SampleViewController: BaseViewController, UITextViewDelegate {

    var textView: UITextView!

    ・・・

    func onClickCloseButton(sender: UIButton) {
        textView.resignFirstResponder()
    }

こんな感じで実装できました

以上です