Swift中如何避免点击导航返回时触发editingDidEnd?
解决Swift中点击导航返回时触发TextField editingDidEnd的问题
你可以通过添加状态标记来区分「用户主动结束编辑」和「控制器被返回弹出导致的编辑结束」,具体实现方案如下:
方案一:利用控制器生命周期标记状态
- 在
BViewController中添加私有属性,标记是否处于返回上一页的状态:
private var isNavigatingBack = false
- 重写
viewWillDisappear方法,判断控制器是否被弹出导航栈,设置对应标记:
override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) // 当控制器被pop或dismiss时,标记为返回状态 isNavigatingBack = isMovingFromParent || isBeingDismissed }
- 重写
viewWillAppear方法,重置标记,避免下次进入控制器时状态异常:
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) isNavigatingBack = false }
- 在
editingDidEnd方法中判断标记,仅非返回状态执行校验弹窗逻辑:
func editingDidEnd(_ value: String, textField: SearchTextField) { // 如果是返回触发的编辑结束,直接跳过后续逻辑 guard !isNavigatingBack else { return } // 这里执行你的校验和弹窗逻辑 // showingalert }
方案二:自定义导航返回按钮(可选)
如果需要完全控制返回流程,可以替换系统返回按钮,手动标记状态:
- 在
viewDidLoad中设置自定义返回按钮:
override func viewDidLoad() { super.viewDidLoad() let backBtn = UIBarButtonItem(title: "返回", style: .plain, target: self, action: #selector(onBackTapped)) navigationItem.leftBarButtonItem = backBtn }
- 实现返回按钮点击事件:
@objc private func onBackTapped() { isNavigatingBack = true // 手动让TextField结束编辑 textField.resignFirstResponder() // 弹出当前控制器 navigationController?.popViewController(animated: true) }
这种方式可以完全掌控返回交互,但需要自行处理返回按钮的样式适配。
内容的提问来源于stack exchange,提问作者lauwis
相关产品推荐
相关产品推荐

