SwiftUI ViewModel 发布属性和绑定

Wim*_*mps 7 mvvm ios swift swiftui

我的问题可能是误解的结果,但我无法弄清楚,所以这里是:

当使用像 TextField 这样的组件或任何其他需要绑定作为输入的组件时

TextField(title: StringProtocol, text: Binding<String>)
Run Code Online (Sandbox Code Playgroud)

和一个带有 ViewModel 的视图,我自然地认为我可以简单地将我的 ViewModel@Published属性作为绑定传递:

class MyViewModel: ObservableObject { 
     @Published var title: String
     @Published var text: String
}

// Now in my view
var body: some View {
    TextField(title: myViewModel.title, text: myViewModel.$text)
}
Run Code Online (Sandbox Code Playgroud)

但我显然不能,因为出版商不能充当约束力。根据我的理解,只有一个@State属性可以这样做,但不是所有的@State属性都应该只存在于视图中而不是视图模型中吗?或者我可以做这样的事情:

class MyViewModel: ObservableObject { 
     @Published var title: String
     @State var text: String
}
Run Code Online (Sandbox Code Playgroud)

如果我不能,当我的文本更新时,我如何将信息传输到我的 ViewModel?

sEl*_*yan 30

你快到了。你只需要替换myViewModel.$text$myViewModel.text.

class MyViewModel: ObservableObject {

    var title: String = "SwiftUI"

    @Published var text: String = ""
}

struct TextFieldView: View {

    @ObservedObject var myViewModel: MyViewModel = MyViewModel()

    var body: some View {
        TextField(myViewModel.title, text: $myViewModel.text)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 因为您是在视图内部实例化它,所以它不应该是“@StateObject”,而不是“@ObservedObject”吗? (5认同)
  • 您能详细说明这是如何工作的吗?$myViewModel.text 如何满足@Binding? (3认同)
  • @MegaManX 你实际上有 4 种不同的拼写。首先,您有 $myViewModel,它是作为 ObservedObject 的整个结构。第二个是 myViewModel.text,它只是显示在视图上的普通字符串。对于第三个,我们有一个绑定。由于我们想要将文本绑定到 textField,因此我们使用 $myViewModel.text。第四个是 myViewModel.$text。如果我们想要这个变量可以给我们的发布值,我们就会使用它。我们可以使用组合来订阅此内容。 (3认同)

归档时间:

查看次数:

4463 次

最近记录:

5 年,6 月 前