如何在兼容iOS 9的情况下使用UITextFieldDidEndEditingReason
解决iOS9兼容下使用UITextFieldDidEndEditingReason的问题
你遇到的问题是因为带reason参数的textFieldDidEndEditing方法是iOS 10才引入的,直接在兼容iOS9的项目里声明会触发版本兼容报错。其实解决方案很简单——同时实现两个版本的方法,用版本标记区分,让系统自动适配不同iOS版本:
具体实现步骤
- 先实现兼容iOS9及以下的旧版方法
这个方法会在iOS9及更早系统中被调用,你可以在这里处理兼容逻辑,或者把通用逻辑抽成单独的方法复用:
func textFieldDidEndEditing(_ textField: UITextField) { // 对于iOS9,我们可以默认传入一个合理的reason值(比如.committed) handleTextFieldEnd(textField, reason: .committed) }
- 用
@available标记新版方法,只在iOS10+生效
这个方法只会在iOS10及以上系统中被调用,你可以在这里正常使用UITextFieldDidEndEditingReason做判断:
@available(iOS 10.0, *) func textFieldDidEndEditing(_ textField: UITextField, reason: UITextFieldDidEndEditingReason) { if reason == .committed { handleTextFieldEnd(textField, reason: reason) } }
- 抽离共享逻辑(可选但推荐)
把两个方法里的通用处理逻辑放到一个私有方法里,避免代码重复:
private func handleTextFieldEnd(_ textField: UITextField, reason: UITextFieldDidEndEditingReason) { // 这里放所有平台通用的结束编辑逻辑 // 比如验证输入内容、更新数据源等 }
为什么之前的if #available没生效?
if #available是用来在代码块内部做版本判断的,而方法本身的可用性需要用@available属性来标记,告诉编译器这个方法只在指定系统版本以上可用。同时保留旧版方法作为降级方案,系统会根据当前运行的iOS版本自动选择调用哪个方法。
这样既满足了iOS10+下对编辑结束原因的判断需求,又能兼容iOS9系统,不会出现编译报错。
内容的提问来源于stack exchange,提问作者Varun Naharia
相关产品推荐
相关产品推荐

