UITextView resignFirstResponder后导航栏按钮无法点击问题求助
解决导航栏Done按钮键盘消失后无法点击的问题
这个问题我开发时也碰到过!结合你提到的「列表视图控制器启用了长按手势识别器」这个关键信息,最大的嫌疑就是长按手势拦截了导航栏按钮的触摸事件,下面是具体的排查和解决步骤:
问题根源
默认情况下,UIGestureRecognizer的cancelsTouchesInView属性是true——这意味着当手势识别器开始识别手势时,会取消同一视图层级内其他视图的触摸事件。你的DetailViewController是从列表页push进来的,列表的长按手势可能依然在响应链中,导致导航栏按钮的点击事件被拦截,不管键盘是否显示都会失效(你更新后发现初始状态也点不了,正好验证了这一点)。
解决方案
1. 修改列表页长按手势的cancelsTouchesInView属性
在列表视图控制器中,创建长按手势的时候,将这个属性设为false:
// 假设你是给tableView添加长按手势 let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPress)) longPressGesture.cancelsTouchesInView = false // 关键设置 yourTableView.addGestureRecognizer(longPressGesture)
这个设置会让手势识别器不再取消其他视图的触摸事件,导航栏按钮就能正常接收点击了。
2. 确认DetailVC中按钮的target设置正确
虽然你提到已经改成了self,再确认一下按钮初始化代码:
let buttonDone = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(didClickDone))
确保target不是nil,否则按钮永远不会响应事件。
3. 排查导航栏交互是否被禁用(可选)
如果上面两步还没解决,可以检查导航栏的用户交互状态,在DetailVC的viewDidLoad中添加:
self.navigationController?.navigationBar.isUserInteractionEnabled = true
不过这个情况出现的概率较低,主要作为兜底排查项。
验证
修改完长按手势的属性后,重新测试:不管键盘是否弹出,点击Done按钮都应该能正常打印日志并执行对应逻辑了。
内容的提问来源于stack exchange,提问作者Teng L
相关产品推荐
相关产品推荐

