LoginSignup
0
1

More than 3 years have passed since last update.

編集中のUITableViewCell外をタップしたらキーボードを閉じる

Last updated at Posted at 2021-04-07

要件

UITableViewCell内にUITextFieldやUITextViewがあり、入力箇所とは別の部分をタップしたらキーボードを閉じたい。  

extension

  • 表示されているCellの中からファーストレスポンダを探すメソッドを生やす
extension UITableView {
    func findFirstResponder() -> UIView? {
        visibleCells.compactMap { cell in
            cell.contentView.subviews.first { $0.isFirstResponder }
        }.first
    }
}

UIViewController

class ViewController: UIViewController {
    @IBOutlet weak var tableView: UITableView!
    // ※1 タップジェスチャーを用意
    private lazy var tapGesture = {
        UITapGestureRecognizer(target: self, action: #selector(tappedGesture(gestureRecognizer:)))
    }() 

    override func viewDidLoad() {
        super.viewDidLoad()
        observeNotifications()
   }

    // ※2 tapしたときの処理
    @objc
    func tappedGesture(gestureRecognizer: UITapGestureRecognizer) {
        // ファーストレスポンダを探し、resignする
        tableView.findFirstResponder()?.resignFirstResponder()
    }

    // キーボードの表示通知を監視
    func observeNotifications() {
        // ※3 キーボードが表示されたら Viewにジェスチャーを追加
        NotificationCenter.default.addObserver(forName: UIResponder.keyboardWillShowNotification, object: nil, queue: .current) { [weak self] _ in
            guard let self = self else { return }
            // tap gesture追加
            self.view.addGestureRecognizer(self.tapGesture)
        }
        // ※4 キーボードが閉じたらジェスチャーを解除
        NotificationCenter.default.addObserver(forName: UIResponder.keyboardWillHideNotification, object: nil, queue: .current) { [weak self] _ in
            guard let self = self else { return }
            // tap gesture解除
            self.view.removeGestureRecognizer(self.tapGesture)
        }
    }    
}

drag もしくは scrollで閉じる

もしタップではなくドラッグもしくはスクロールしたときに閉じたい場合は、UITableViewの設定だけで可能。

tableView.keyboardDismissMode = .onDrag // or .interactive
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1