You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:53:31