由于tapGestureRecognizer,DidSelectRow方法被禁用

我工作在swift 3.0中的项目,我有UIViewController填充几个文本字段。 因此,我已经使用了一个表视图作为下拉菜单,一旦select了一行,它将被分配给一个UILabel。 另外,我添加了一个UITapGuestureRecognizer方法来确保一旦屏幕被点击,键盘就会隐藏起来。 不幸的是,由于这种方法我的didSelectRow不工作,事实上,一旦一行被点击名称将不会被分配到UILable。 但是,当我消除UITapGusture方法,它工作正常。 我该如何解决这个问题? 代码如下。

import UIKit import CoreData class AddRecurringExpensesViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { @IBOutlet weak var selectCategoryLabel: UILabel! @IBOutlet weak var expenseNameTextField: UITextField! @IBOutlet weak var amountTextField: UITextField! @IBOutlet weak var toTextField: UITextField! @IBOutlet weak var fromTextField: UITextField! @IBOutlet weak var recurringexpenseTypeTableView: UITableView! @IBOutlet weak var fromDatePicker: UIDatePicker! @IBOutlet weak var fromDatePickerView: UIView! @IBOutlet weak var toDatePickerView: UIView! @IBOutlet weak var toDatePicker: UIDatePicker! var selectCategoryArray = ["Entertainment", "Food", "Membership", "Misc", "Purchase", "Subscription", "Transport", "Utility", "Other"] override func viewDidLoad() { super.viewDidLoad() self.fromDatePickerView.isHidden = true self.toDatePickerView.isHidden = true self.recurringexpenseTypeTableView.isHidden = true let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(AddRecurringExpensesViewController.dismissKeyboard)) view.addGestureRecognizer(tap) } func dismissKeyboard() { //Causes the view (or one of its embedded text fields) to resign the first responder status. view.endEditing(true) } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return selectCategoryArray.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = UITableViewCell () cell.textLabel?.text = selectCategoryArray[indexPath.row] return cell } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { self.selectCategoryLabel.text = selectCategoryArray[indexPath.row] print("selected row is \(selectCategoryLabel.text)") self.recurringexpenseTypeTableView.isHidden = true } @IBAction func selectCategoryButtonPressed(_ sender: AnyObject) { self.recurringexpenseTypeTableView.isHidden = false } @IBAction func fromDateButtonPressed(_ sender: AnyObject) { self.fromDatePickerView.isHidden = false } @IBAction func fromDateAddedButtonPressed(_ sender: AnyObject) { let dateFormatter = DateFormatter() dateFormatter.dateFormat = "dd MMM yyyy" fromTextField.text = dateFormatter.string(from:fromDatePicker.date) self.fromDatePickerView.isHidden = true } @IBAction func toDateButtonPressed(_ sender: AnyObject) { self.toDatePickerView.isHidden = false } @IBAction func toDateAddedButtonPressed(_ sender: AnyObject) { let dateFormatter = DateFormatter () dateFormatter.dateFormat = "dd MMM yyyy" toTextField.text = dateFormatter.string(from: toDatePicker.date) self.toDatePickerView.isHidden = true } 

你是对的,由于tapGestureRecognizer,DidSelectRow方法将被禁用,你可以尝试在'touchsbegin'中执行'view.endEditing(true)',记得重写超级func。当UITableview存在时,不要使用tapGestureRecognizer。

  override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { super.touchesBegan(touches, with: event) view.endEditing(true) } 

修改您的解雇键盘function如下,

 func dismissKeyboard() { if self.recurringexpenseTypeTableView.isHidden == true { view.endEditing(true) } } 

你可以看到它作为层叠在一起。 用UITapGuestureRecognizer你已经添加了一个新层。 当用户按下屏幕时,顶层被调用(UITapGuestureRecognizer)。 它下面的图层将不会被调用。

对于这种情况,我build议您删除UITapGuestureRecognizer图层。 并在DidSelectRow中添加键盘的closures。