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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 23:45:34