Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Properties 无法使用UseDefaults的PropertyRapper调用类型“TextField”的初始值设定项_Properties_Wrapper_Swiftui_Combine - Fatal编程技术网

Properties 无法使用UseDefaults的PropertyRapper调用类型“TextField”的初始值设定项

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

我正在使用SwiftUI屏幕更新UserDefault中的多个值,以允许应用程序保留基本设置。我正在尝试使用Combine和SwiftUI,因为这是一款本机WatchOS应用程序

基本视图给了我一个错误,我认为这与PropertyRapper for UserDefaults有关,但由于我从未使用过PropertyRapper或Combine,因此我无法找出如何修复此问题

以下是属性包装:

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)