Swiftui 如何将数据子集传递给具有自己视图模型的视图?
鉴于以下情况Swiftui 如何将数据子集传递给具有自己视图模型的视图?,swiftui,Swiftui,鉴于以下情况 import SwiftUI class ViewModel: ObservableObject { var value: Bool init(value: Bool) { self.value = value } func update() { value = !value } } struct A: View { @ObservedObject let v
import SwiftUI
class ViewModel: ObservableObject {
var value: Bool
init(value: Bool) {
self.value = value
}
func update() {
value = !value
}
}
struct A: View {
@ObservedObject let viewModel: ViewModel
init(value: Bool) {
viewModel = ViewModel(value: value)
}
var body: some View {
Text("\(String(viewModel.value))")
.onTapGesture {
viewModel.update()
}
}
}
struct B: View {
@State var val = [true, false, true]
var body: some View {
A(value: val[0])
}
}
如何让
viewModel
更新B
的val
?看起来我应该能够在A
的内部使用@Binding
,但是我不能在ViewModel
的内部使用@Binding
,这是我想要运行修改代码的地方。然后,我认为我不需要@ObservedObject
,因为渲染将从B
开始,您或者需要绑定
,或者在视图模型
中有一个做同样事情的等价物。你为什么说你不能用它
结构A:视图{
@观测对象var模型:模型
init(值:绑定){
model=.init(值:value)
}
var body:一些观点{
文本(字符串(model.value))
.ontapsignate(执行:model.update)
}
}
扩展A{
最终类模型:ObservieObject{
@绑定私有(集合)变量值:Bool
init(值:绑定){
_价值=价值
}
func update(){
value.toggle()
}
}
}
结构B:视图{
@状态变量val=[真、假、真]
var body:一些观点{
A(值:$val[0])
}
}
您需要在
ViewModel
中使用绑定
,或者使用一种等效的绑定方式。你为什么说你不能用它
结构A:视图{
@观测对象var模型:模型
init(值:绑定){
model=.init(值:value)
}
var body:一些观点{
文本(字符串(model.value))
.ontapsignate(执行:model.update)
}
}
扩展A{
最终类模型:ObservieObject{
@绑定私有(集合)变量值:Bool
init(值:绑定){
_价值=价值
}
func update(){
value.toggle()
}
}
}
结构B:视图{
@状态变量val=[真、假、真]
var body:一些观点{
A(值:$val[0])
}
}
如果要更新父对象拥有的值,则需要将
绑定从父对象传递给子对象。子项更改绑定
,从而更新父项的值
然后,您需要在孩子自己的视图模型更新时更新该绑定。您可以通过订阅@Published
属性来执行此操作:
struct A: View {
@ObservedObject var viewModel: ViewModel
@Binding var value: Bool // add a binding
init(value: Binding<Bool>) {
_value = value
viewModel = ViewModel(value: _value.wrappedValue)
}
var body: some View {
Button("\(String(viewModel.value))") {
viewModel.update()
}
// subscribe to changes in view model
.onReceive(viewModel.$value, perform: {
value = $0 // update the binding
})
}
}
如果要更新父对象拥有的值,需要将绑定从父对象传递给子对象。子项更改绑定
,从而更新父项的值
然后,您需要在孩子自己的视图模型更新时更新该绑定。您可以通过订阅@Published
属性来执行此操作:
struct A: View {
@ObservedObject var viewModel: ViewModel
@Binding var value: Bool // add a binding
init(value: Binding<Bool>) {
_value = value
viewModel = ViewModel(value: _value.wrappedValue)
}
var body: some View {
Button("\(String(viewModel.value))") {
viewModel.update()
}
// subscribe to changes in view model
.onReceive(viewModel.$value, perform: {
value = $0 // update the binding
})
}
}
在视图模型类中使用@Binding时,我得到了“未知属性‘Binding’”。但当类在扩展中定义时,就不会像您所做的那样。哦,天哪。我忘了导入快捷界面。所以我根本不需要问这个问题。在视图模型类中使用@Binding时,我得到了“未知属性‘Binding’”。但当类在扩展中定义时,就不会像您所做的那样。哦,天哪。我忘了导入快捷界面。所以我根本不需要问这个问题。人们必须注意自己的假设。