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

Swift中如何避免点击导航返回时触发editingDidEnd?

解决Swift中点击导航返回时触发TextField editingDidEnd的问题

你可以通过添加状态标记来区分「用户主动结束编辑」和「控制器被返回弹出导致的编辑结束」,具体实现方案如下:

方案一:利用控制器生命周期标记状态

  1. 在BViewController中添加私有属性,标记是否处于返回上一页的状态:
private var isNavigatingBack = false
  1. 重写viewWillDisappear方法,判断控制器是否被弹出导航栈,设置对应标记:
override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    // 当控制器被pop或dismiss时,标记为返回状态
    isNavigatingBack = isMovingFromParent || isBeingDismissed
}
  1. 重写viewWillAppear方法,重置标记,避免下次进入控制器时状态异常:
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    isNavigatingBack = false
}
  1. 在editingDidEnd方法中判断标记,仅非返回状态执行校验弹窗逻辑:
func editingDidEnd(_ value: String, textField: SearchTextField) {
    // 如果是返回触发的编辑结束,直接跳过后续逻辑
    guard !isNavigatingBack else { return }
    
    // 这里执行你的校验和弹窗逻辑
    // showingalert
}

方案二:自定义导航返回按钮(可选)

如果需要完全控制返回流程,可以替换系统返回按钮,手动标记状态:

  1. 在viewDidLoad中设置自定义返回按钮:
override func viewDidLoad() {
    super.viewDidLoad()
    let backBtn = UIBarButtonItem(title: "返回", style: .plain, target: self, action: #selector(onBackTapped))
    navigationItem.leftBarButtonItem = backBtn
}
  1. 实现返回按钮点击事件:
@objc private func onBackTapped() {
    isNavigatingBack = true
    // 手动让TextField结束编辑
    textField.resignFirstResponder()
    // 弹出当前控制器
    navigationController?.popViewController(animated: true)
}

这种方式可以完全掌控返回交互,但需要自行处理返回按钮的样式适配。

内容的提问来源于stack exchange,提问作者lauwis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 03:51:35