SwiftUI实现适配器自动切换不同iOS版本TextFieldStyle的方法
跨系统版本TextFieldStyle适配器实现
现有两个TextFieldStyle实现,其中TF2仅在iOS 15.0及以上版本可用,代码如下:
struct TF1: TextFieldStyle { init() func _body(configuration: TextField<Self._Label>) -> some View {} }
@available(iOS 15.0, *) struct TF2: TextFieldStyle { @FocusState var focused: Bool init() func _body(configuration: TextField<Self._Label>) -> some View {} }
原有通过系统版本判断分支给TextField应用.textFieldStyle()修饰符的写法可正常运行,但代码冗余度高,示例代码如下:
if #available(iOS 15.0, *) { TextField("").textFieldStyle(TF2()) } else { TextField("").textFieldStyle(TF1()) }
你可以通过自定义适配器的方式把版本判断逻辑完全封装,无需每次调用时手动写分支,适配器实现代码如下:
struct TfVersionAdapter: TextFieldStyle { init() {} func _body(configuration: TextField<Self._Label>) -> some View { if #available(iOS 15.0, *) { TF2()._body(configuration: configuration) } else { TF1()._body(configuration: configuration) } } }
使用时无需编写任何版本判断逻辑,直接调用即可:
TextField("输入占位符", text: $inputValue) .textFieldStyle(TfVersionAdapter())
实现说明
- 适配器本身未添加系统版本限制,从iOS 13起的所有SwiftUI版本均可正常运行
- 内部直接调用对应样式的
_body方法传入配置参数,和系统原生加载对应样式的执行逻辑完全一致,不会出现渲染差异 - 版本判断逻辑仅需在适配器中编写一次,所有调用场景可直接复用,彻底消除重复冗余代码
内容的提问来源于stack exchange,提问作者oaranger
相关产品推荐
相关产品推荐

