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

macOS Ventura 13.0下SwiftUI TextField自定义Binding无法输入

macOS Ventura 13.0 SwiftUI TextField 自定义Binding无法输入问题

很多开发者都遇到过这个问题:升级到macOS Ventura 13.0后,SwiftUI的TextField使用get: set:方式自定义Binding时,会出现无法输入内容的异常,该问题在旧版系统中不存在。

问题原因分析

你提供的代码里,自定义Binding的get返回testing1,但set却把值赋值给testing2。Ventura 13.0之后,SwiftUI的TextField会严格依赖Binding的get方法返回值同步UI状态:输入内容时,set修改了testing2,但testing1没更新,导致get始终返回旧值,TextField无法感知输入变化,进而出现无法输入的情况。旧版系统对这种Binding的一致性校验没这么严格,所以之前能正常运行。

解决方案

根据需求,有两种常见解决方式:

1. 让Binding的get和set关联同一个状态变量

如果不需要分开维护testing1和testing2,直接让Binding读写指向同一个@State变量即可:

struct ContentView: View {
    @State var testing1 = ""

    var body: some View {
        VStack {
            Image(systemName: "globe")
                .imageScale(.large)
                .foregroundColor(.accentColor)
            TextField("Enter Text", text: Binding<String>(
                get: { testing1 },
                set: { testing1 = $0 }
            ))
        }
        .padding()
    }
}

或者更简洁的写法:

TextField("Enter Text", text: $testing1)

2. 若需关联不同变量,确保状态同步

如果确实需要同时更新testing1和testing2,在set方法里同时修改两个变量,保证get返回的testing1能同步输入内容:

struct ContentView: View {
    @State var testing1 = ""
    @State var testing2 = ""

    var body: some View {
        VStack {
            Image(systemName: "globe")
                .imageScale(.large)
                .foregroundColor(.accentColor)
            TextField("Enter Text", text: Binding<String>(
                get: { testing1 },
                set: {
                    testing1 = $0
                    testing2 = $0
                }
            ))
        }
        .padding()
    }
}

验证效果

修改后,TextField就能在macOS Ventura 13.0上正常接收输入,状态同步也能正常工作。

内容的提问来源于stack exchange,提问作者swiftnoob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 11:45:35