我有一个表格视图,顶部有一个搜索栏。我想实现以下行为:当点击搜索栏然后用户点击其他任何地方时,搜索栏将成为第一响应者(键盘被隐藏),但同时,表视图的单元格是没有被选中。我不使用其他视图进行搜索。以下是我使用搜索栏查看表的方式(我知道,当我在模拟器上运行项目时,表视图的分隔符存在问题。无法弄清楚原因):
目前,当我点击其他地方时,搜索栏会成为第一个响应者,但问题是,单元格也被选中了。这没关系,但有时,当我有更复杂的单元格(不像图像中的单元格)时,视图之间的过渡不是很平滑。如果您知道如何使转换顺利进行,那也没关系,或者,我将不胜感激任何有关实现行为的建议,如上所述。
答案 0 :(得分:2)
在表格视图上放置UITapGestureRecognizer
以响应点按。
默认情况下,将点击识别器设置为禁用。
tapRecognizer.isEnabled = false
当搜索栏变为活动状态时,重新启用点击识别器。
tapRecognizer.isEnabled = false
当识别出点击时,通过重新设置搜索栏的第一个响应者来关闭键盘。另外,请确保禁用点击识别器,以便您可以照常选择表格视图单元格。
@objc private func handleTap(recognizer: UITapGestureRecognizer) {
searchBar.resignFirstResponder()
recognizer.isEnabled = false
}
答案 1 :(得分:1)
另一种方法是正确实现tableView didSelectRow
委托方法。
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if searchBar.isFirstResponder {
searchBar.resignFirstResponder()
tableView.deselectRow(at: indexPath, animated: false)
return
}
// perform your actions (present/push controller, etc.)
}
如果您尝试在真实设备上测试应用程序,您会看到tableView中的分隔符没有问题。它只是模拟器问题:))