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
相关产品推荐
相关产品推荐

