SwiftUI ViewModel 发布的属性和绑定

Posted

技术标签:

【中文标题】SwiftUI ViewModel 发布的属性和绑定【英文标题】:SwiftUI ViewModel published property and binding 【发布时间】:2020-08-11 15:37:30 【问题描述】:

我的问题可能是误会的结果,但我想不通,所以在这里:

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

TextField(title: StringProtocol, text: Binding<String>)

还有一个带有 ViewModel 的 View,我自然认为我可以简单地将我的 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)

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

class MyViewModel: ObservableObject  
     @Published var title: String
     @State var text: String

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

【问题讨论】:

【参考方案1】:

你快到了。您只需将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)
    


【讨论】:

你能详细说明这是如何工作的吗? $myViewModel.text 是如何满足@Binding 的?

以上是关于SwiftUI ViewModel 发布的属性和绑定的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 使 Image 的内容响应属性更新

如何为用作 DataGrid 的 ItemsSource 的项目的集合属性中的每个项目生成和绑定一列

已发布的属性未在 SwiftUI 中更新

在 SwiftUI 组件之间共享 ViewModel

SwiftUI 中 ViewModel + View 之间的通信

如何在 SwiftUI 中通过 ViewModel 传播模型更改?