SwiftUI TextField设置textContentType在iOS14.4.1设备上输入卡顿求助
可行解决思路
这个问题是iOS 14系统版本中SwiftUI TextField的已知底层bug,由textContentType触发系统键盘联想/自动填充逻辑的重复计算导致,可通过以下几种方案修复:
- 方案1:分系统版本兼容处理
该bug在iOS 15及以上系统已被官方修复,仅需对iOS14版本做降级处理,高版本保留textContentType的自动填充能力:
首先添加View条件扩展:
调用时判断系统版本:extension View { @ViewBuilder func apply<T: View>(if condition: Bool, modifier: (Self) -> T) -> some View { if condition { modifier(self) } else { self } } }TextField("TextField", text: $text) .background(Color.green) .apply(if: UIDevice.current.systemVersion.compare("15.0", options: .numeric) != .orderedAscending) { $0.textContentType(.emailAddress) } - 方案2:用UIKit封装的TextField替代原生SwiftUI组件
若需要在iOS14上也保留textContentType的自动填充能力,可以封装UITextField使用,不存在原生SwiftUI的性能问题:
封装代码:
使用方式:struct UIKitTextField: UIViewRepresentable { let placeholder: String @Binding var text: String let contentType: UITextContentType? func makeUIView(context: Context) -> UITextField { let tf = UITextField() tf.placeholder = placeholder tf.textContentType = contentType tf.addTarget(context.coordinator, action: #selector(Coordinator.textDidChange), for: .editingChanged) return tf } func updateUIView(_ uiView: UITextField, context: Context) { uiView.text = text } func makeCoordinator() -> Coordinator { Coordinator(text: $text) } class Coordinator: NSObject { @Binding var text: String init(text: Binding<String>) { _text = text } @objc func textDidChange(_ sender: UITextField) { text = sender.text ?? "" } } }UIKitTextField(placeholder: "TextField", text: $text, contentType: .emailAddress) .background(Color.green) - 方案3:临时应急修复(关闭自动联想)
无需修改组件的前提下,添加disableAutocorrection修饰符即可大幅缓解卡顿:TextField("TextField", text: $text) .textContentType(.emailAddress) .disableAutocorrection(true) .background(Color.green)
内容的提问来源于stack exchange,提问作者user1302387
相关产品推荐
相关产品推荐

