Swiftui 将@State变量传递给类,以便它可以对其进行更改

Swiftui 将@State变量传递给类,以便它可以对其进行更改,swiftui,Swiftui,下面的代码就是我试图尝试的。我想将@State myName传递给类,并允许在按下按钮时对其进行更改。还有很多,这是我唯一坚持的部分。当我运行这个程序时,没有错误,但它什么也不做。如果我将其更改为self.helper.fieldBeingEdited=self.$myName,则会给出一个错误。类帮助器中有更多的代码,看起来它必须是一个类,而不是一个结构。有没有一个简单的方法可以做到这一点 我还应该提到,最后,多个文本字段将使用同一个Helper,每个文本字段都将@State变量发送给Help

下面的代码就是我试图尝试的。我想将@State myName传递给类,并允许在按下按钮时对其进行更改。还有很多,这是我唯一坚持的部分。当我运行这个程序时,没有错误,但它什么也不做。如果我将其更改为self.helper.fieldBeingEdited=self.$myName,则会给出一个错误。类帮助器中有更多的代码,看起来它必须是一个类,而不是一个结构。有没有一个简单的方法可以做到这一点

我还应该提到,最后,多个文本字段将使用同一个Helper,每个文本字段都将@State变量发送给Helper,由changeField进行更改

更新问题,以澄清我试图实现的目标:

我希望TextField更改myName,并希望将myName传递给一个类,该类可以通过按下按钮来修改myName。但是我也希望能够将otherName传递给同一个helper类


我认为这将实现您可能有疑问的目标:

类助手:observeObject{ var fieldBeingEdited:Binding=.constantinit 函数变换域{ fieldBeingEdited.wrappedValue=其他内容 } } 结构ContentView:View{ @State var myName=John @State var otherName=Paul @StateObject var helper=helper var body:一些观点{ VStack{ text字段您的姓名,text:$myName .ontapsigne{ self.helper.fieldBeingEdited=self.$myName } text字段其他名称,text:$otherName .ontapsigne{ self.helper.fieldBeingEdited=self.$otherName } 按钮操作:{ self.helper.changeField } { 文本更改 } } } }
请记住,ONTAPPORATION并不是激活文本字段的唯一方式,因此您最好使用文本字段的编辑回调来设置要编辑的字段。

我认为这将实现您可能有疑问的目标:

类助手:observeObject{ var fieldBeingEdited:Binding=.constantinit 函数变换域{ fieldBeingEdited.wrappedValue=其他内容 } } 结构ContentView:View{ @State var myName=John @State var otherName=Paul @StateObject var helper=helper var body:一些观点{ VStack{ text字段您的姓名,text:$myName .ontapsigne{ self.helper.fieldBeingEdited=self.$myName } text字段其他名称,text:$otherName .ontapsigne{ self.helper.fieldBeingEdited=self.$otherName } 按钮操作:{ self.helper.changeField } { 文本更改 } } } }
请记住,OnTap手势并不是激活文本字段的唯一方式,因此,您最好使用TextField的编辑回调来设置fieldBeingEdited。

我不太明白您想做什么,但是SwiftUI结构不应该初始化对象,除非使用@StateObject包装属性,在这种情况下,您不需要ObserveObject。当一个结构被包装在@State中时,它可以被修改,您应该使用一个结构将视图需要的所有状态属性组合到一个配置中,如下所示:

struct ContentViewConfig {
    var myName = "John"
    var otherName = "Paul"
    var fieldBeingEdited: String = ""

    mutating func changeField() {
        fieldBeingEdited = "Something else"
    }
}


struct ContentView: View {
    @State var config = ContentViewConfig()

    var body: some View {
        VStack {
            TextField("Your Name", text: $config.myName)
                .onTapGesture {
                    config.fieldBeingEdited = "Your Name"
            }
            TextField("Other Name", text: $config.otherName)
                .onTapGesture {
                    config.fieldBeingEdited = "Other Name"
            }
            Button(action: {
                config.changeField()
            }) {
                Text("Change")
            }
        }
    }
}

我真的不明白您想做什么,但是SwiftUI结构不应该初始化对象,除非用@StateObject包装属性,在这种情况下,您不需要ObserveObject。当一个结构被包装在@State中时,它可以被修改,您应该使用一个结构将视图需要的所有状态属性组合到一个配置中,如下所示:

struct ContentViewConfig {
    var myName = "John"
    var otherName = "Paul"
    var fieldBeingEdited: String = ""

    mutating func changeField() {
        fieldBeingEdited = "Something else"
    }
}


struct ContentView: View {
    @State var config = ContentViewConfig()

    var body: some View {
        VStack {
            TextField("Your Name", text: $config.myName)
                .onTapGesture {
                    config.fieldBeingEdited = "Your Name"
            }
            TextField("Other Name", text: $config.otherName)
                .onTapGesture {
                    config.fieldBeingEdited = "Other Name"
            }
            Button(action: {
                config.changeField()
            }) {
                Text("Change")
            }
        }
    }
}

是的,这就成功了。我只是用“取消”、“清除”和“完成”按钮创建一个键盘附件视图。SwiftUI结构不应该初始化对象,现在它们不再需要初始化对象,使用新的@StateObject。我已经更新了答案。是的,这成功了。我只是用“取消”、“清除”和“完成”按钮创建一个键盘附件视图。SwiftUI结构不应该初始化对象,现在它们不再需要初始化对象,使用新的@StateObject。我已经更新了答案。