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

如何在兼容iOS 9的情况下使用UITextFieldDidEndEditingReason

解决iOS9兼容下使用UITextFieldDidEndEditingReason的问题

你遇到的问题是因为带reason参数的textFieldDidEndEditing方法是iOS 10才引入的,直接在兼容iOS9的项目里声明会触发版本兼容报错。其实解决方案很简单——同时实现两个版本的方法,用版本标记区分,让系统自动适配不同iOS版本:

具体实现步骤

  1. 先实现兼容iOS9及以下的旧版方法
    这个方法会在iOS9及更早系统中被调用,你可以在这里处理兼容逻辑,或者把通用逻辑抽成单独的方法复用:
func textFieldDidEndEditing(_ textField: UITextField) {
    // 对于iOS9,我们可以默认传入一个合理的reason值(比如.committed)
    handleTextFieldEnd(textField, reason: .committed)
}
  1. 用@available标记新版方法,只在iOS10+生效
    这个方法只会在iOS10及以上系统中被调用,你可以在这里正常使用UITextFieldDidEndEditingReason做判断:
@available(iOS 10.0, *)
func textFieldDidEndEditing(_ textField: UITextField, reason: UITextFieldDidEndEditingReason) {
    if reason == .committed {
        handleTextFieldEnd(textField, reason: reason)
    }
}
  1. 抽离共享逻辑(可选但推荐)
    把两个方法里的通用处理逻辑放到一个私有方法里,避免代码重复:
private func handleTextFieldEnd(_ textField: UITextField, reason: UITextFieldDidEndEditingReason) {
    // 这里放所有平台通用的结束编辑逻辑
    // 比如验证输入内容、更新数据源等
}

为什么之前的if #available没生效?

if #available是用来在代码块内部做版本判断的,而方法本身的可用性需要用@available属性来标记,告诉编译器这个方法只在指定系统版本以上可用。同时保留旧版方法作为降级方案,系统会根据当前运行的iOS版本自动选择调用哪个方法。

这样既满足了iOS10+下对编辑结束原因的判断需求,又能兼容iOS9系统,不会出现编译报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:32:41