使用TextField时出现输入卡顿、光标跳转问题该如何解决?
问题:TextField绑定CoreData可选String属性时异常卡顿、光标跳转
我用TextField修改CoreData实体的String?属性时体验极差:输入空格或触发自动更正时,光标会跳转到输入框末尾,还会出现按键丢失、整体卡顿的情况。TextEditor则运行正常,该问题仅在多台真机上出现,模拟器无此现象。
请问我哪里操作有误?是TextField的使用方式不正确吗?
(附问题演示动图:TextField异常表现动图)
相关代码
基于Xcode初始项目,仅为CoreData的Item实体添加了text: String?属性:
struct Detail: View { @ObservedObject var item: Item var body: some View { VStack { Form { Section(content: { TextField("Title", text: $item.text ?? "") }, header: { Text("TextField") }) Section(content: { TextEditor(text: $item.text ?? "") }, header: { Text("TextEditor") }) } } } } // 处理可选类型的Binding工具方法 func ??<T>(lhs: Binding<Optional<T>>, rhs: T) -> Binding<T> { Binding( get: { lhs.wrappedValue ?? rhs }, set: { lhs.wrappedValue = $0 } ) }
解决方法(更新)
我将TextField封装为子视图,通过本地状态缓存输入内容,待值变化时再写回NSManagedObject,解决了该问题,代码如下:
struct CustomTextField: View { @Binding var string: String? @State var localString: String let prompt: String init(string: Binding<String?>, prompt: String) { _string = string _localString = State(initialValue: string.wrappedValue ?? "") self.prompt = prompt } var body: some View { TextField(prompt, text: $localString, axis: .vertical) .onChange(of: localString) { _ in string = localString } } }
内容的提问来源于stack exchange,提问作者Christian Stevenson
相关产品推荐
相关产品推荐

