Properties 无法使用UseDefaults的PropertyRapper调用类型“TextField”的初始值设定项
我正在使用SwiftUI屏幕更新UserDefault中的多个值,以允许应用程序保留基本设置。我正在尝试使用Combine和SwiftUI,因为这是一款本机WatchOS应用程序 基本视图给了我一个错误,我认为这与PropertyRapper for UserDefaults有关,但由于我从未使用过PropertyRapper或Combine,因此我无法找出如何修复此问题 以下是属性包装:Properties 无法使用UseDefaults的PropertyRapper调用类型“TextField”的初始值设定项,properties,wrapper,swiftui,combine,Properties,Wrapper,Swiftui,Combine,我正在使用SwiftUI屏幕更新UserDefault中的多个值,以允许应用程序保留基本设置。我正在尝试使用Combine和SwiftUI,因为这是一款本机WatchOS应用程序 基本视图给了我一个错误,我认为这与PropertyRapper for UserDefaults有关,但由于我从未使用过PropertyRapper或Combine,因此我无法找出如何修复此问题 以下是属性包装: import Foundation @propertyWrapper struct UserDefaul
import Foundation
@propertyWrapper
struct UserDefault<T> {
let key: String
let defaultValue: T
init(_ key: String, defaultValue: T) {
self.key = key
self.defaultValue = defaultValue
}
var wrappedValue: T {
get {
UserDefaults(suiteName: "group.com.my.app")!.value(forKey: key) as? T ?? defaultValue
} set {
UserDefaults(suiteName: "group.com.my.app")!.set(newValue, forKey: key)
}
}
}
TextField然后给出无法推断通用参数'Label'的消息。Xcode提供修复此问题,但最终结果是TextField,这显然是不完整的,但整个程序中唯一的视图是ContentView,它是无效的。问题是TextField的初始化器首先将字符串作为占位符,然后将其绑定到的值作为占位符,因此大致如下所示:
TextField("Placeholder",
value: self.$setup.someValueDouble,
formatter: currencyFormatter,
onEditingChanged: { _ in },
onCommit:{})
.keyboardType(.numberPad)
您可能想了解更多关于TextFields和Formatter的信息,因为这似乎是一个棘手的主题。谢谢,当我添加.keyboardType.numberPad时-我得到的“TextField”类型的值没有成员“keyboardType”,除此之外,它工作得很好!谢谢,现在我需要弄清楚为什么它在我的实际代码中不起作用,只在我上面发布的简化代码中起作用。明白了。。谢谢你@LuLuGaGa
@ObservedObject var setup: Setup = Setup()
private var currencyFormatter: NumberFormatter = {
let f = NumberFormatter()
f.numberStyle = .currency
return f
}()
var body: some View {
ScrollView{
HStack{
TextField(self.$setup.someValueDouble,
formatter: currencyFormatter,
placeholder: "0.00",
onEditingChanged: {_ in
print("editing changed")
},
onCommit: {
print("updated")
}
)
}
HStack{
Button(action: {
self.setup.opt1Enabled = false
self.setup.opt2Enabled = true
} ) {
Text(verbatim: "Opt 1")
.font(Font.system(size: 16, design: Font.Design.rounded))
}
.background(setup.opt1Enabled ? Color.blue : Color.gray)
.disabled(self.setup.opt1Enabled)
.cornerRadius(5)
Button(action: {
self.setup.opt1Enabled = true
self.setup.opt2Enabled = false
}) {
Text(verbatim: "Opt 2")
}
.background(setup.opt2Enabled ? Color.blue : Color.gray)
.disabled(self.setup.opt2Enabled)
}
}
}
}
TextField("Placeholder",
value: self.$setup.someValueDouble,
formatter: currencyFormatter,
onEditingChanged: { _ in },
onCommit:{})
.keyboardType(.numberPad)