14
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

UITableView内のタッチイベントをViewControllerに渡す方法

Last updated at Posted at 2016-11-01

UITableView内のタッチイベントをViewControllerに渡す方法

1. 困っていたこと

TableViewCell内のTextFieldを選択後、他の場所をタップしてもキーボードが消えない…

キーボードが消えない

UITablelView内のタップイベントはUIViewControllerへ伝わらないため、どうしても消せなかった…

2. どうしたいか

キーボードを消したい。

キーボードを消したい

3. どのように解決したか

UITableViewを継承したCustomTableViewを作り、touchesBeganをオーバーライドし、UIViewControllerへtouchesBeganを繋げた。

CustomTableView.swift

import Foundation
import UIKit

class CustomTableView: UITableView {

    override open func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        print("chain to the next responder")
        // touchesBeganを次のResponderへ
        self.next?.touchesBegan(touches, with: event)
    }
    
    override open func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        print("touches ended")
    }

}

![CustomeTableViewをセット](https://racooma.com/qiita/20161102/screenShot_2016-11-02 01.24.17.png "CustomeTableViewをセット")

UITexFieldDelegateを追加、touchesBegan()をオーバーライドし、self.view.endEditing(true)を記述する。

SettingsViewController.swift

import UIKit

class SettingsViewController: UITableViewController, UIPickerViewDelegate, UIImagePickerControllerDelegate, UITextFieldDelegate, UINavigationControllerDelegate, UIGestureRecognizerDelegate {

  // code
  
  override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

        print(event!)
        self.view.endEditing(true)
        
        if (useridTextField.isFirstResponder) {
            useridTextField.resignFirstResponder()
        }
        if (usernameTextField.isFirstResponder) {
            usernameTextField.resignFirstResponder()
        }
        if (postalcodeTextField.isFirstResponder) {
            postalcodeTextField.resignFirstResponder()
        }
        if (addressTextField.isFirstResponder) {
            addressTextField.resignFirstResponder()
        }
    }

TableView内のCellとしてTextFieldを配置し、他の場所を選択した場合に編集終了としてキーボードを閉じる記述は以上のようになります。

当初は、Extension UITableVlewとしていたのですが、そうすると既存のUITableViewクラスを使用している任意のパーツにおいて意図しない動作をさせてしまうため、カスタムクラスを作成することをお勧め致します。

少しでも参考になりましたら幸いです。

14
10
2

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
14
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?