为什么';当它';它在macOS的子视图中?

为什么';当它';它在macOS的子视图中?,macos,swiftui,Macos,Swiftui,我有两层可观察对象和已发布属性。当我在视图中直接使用它们时,它们似乎按预期工作。但是,当我尝试将列表移动到它自己的类型时,父视图中的绑定似乎不起作用 例如,为什么启用模型列表,当您选择行时,按钮不会在启用和禁用之间切换。但是,如果将其注释掉并启用List.init行,则在选择和取消选择行时,该按钮将正确启用和禁用 这很有效 View List(selection: viewModel.dataStore.selection) 这是不可能的 View ModelList(dataStore

我有两层可观察对象和已发布属性。当我在视图中直接使用它们时,它们似乎按预期工作。但是,当我尝试将列表移动到它自己的类型时,父视图中的绑定似乎不起作用

例如,为什么启用模型列表,当您选择行时,按钮不会在启用和禁用之间切换。但是,如果将其注释掉并启用List.init行,则在选择和取消选择行时,该按钮将正确启用和禁用

这很有效

View
 List(selection: viewModel.dataStore.selection)
这是不可能的

View
 ModelList(dataStore: viewModel.dataStore) 
  List(selection: dataStore.selection)
完整代码示例

导入快捷界面
结构ContentView:View{
@观察对象变量viewModel:viewModel
var body:一些观点{
VStack{
//使用数据存储,按钮绑定起作用
//List.init(viewModel.dataStore.models,id:\.id,selection:$viewModel.dataStore.selection){
//文本(“名称:\($0.Name)”)
//            }
//使用子视图中的数据存储,按钮绑定不起作用
模型列表(数据存储:viewModel.dataStore)
按钮(操作:{
打印(“删除”)
},标签:{
图像(系统名称:“减号”)
})
.disabled($viewModel.dataStore.selection.wrappedValue.count==0)
文本(“选择\($viewModel.dataStore.Selection.wrappedValue.count)”)
}
}
}
结构模型列表:视图{
@ObservedObject公共var数据存储:数据存储
var body:一些观点{
List.init(dataStore.models,id:\.id,selection:$dataStore.selection){
文本(“名称:\($0.Name)”)
}
}
}
类ViewModel:ObservableObject{
@已发布的var数据存储:数据存储=数据存储()
}
类数据存储:observeObject{
@已发布的公共var selection=Set()
@已发布的公共var模型=[模型(id:1,名称:“第一”)]
}
结构模型:可识别{
让id:Int
let name:String
}
@主要
结构层应用程序:应用程序{
var body:一些场景{
窗口组{
ContentView(viewModel:viewModel())
}
}
}

子视图应该接受一个绑定,而不是另一个ObservedObject

@ObservedObject公共var数据存储:数据存储
应该是
@Binding公共var数据存储:数据存储

现在,在使用子视图时,传入绑定
模型列表(数据存储:$viewModel.dataStore)

完整的工作示例:

struct ContentView:View{
@观察对象变量viewModel:viewModel
var body:一些观点{
VStack{
模型列表(数据存储:$viewModel.dataStore)
按钮(操作:{
打印(“删除\(viewModel.dataStore.selection)”)
},标签:{
图像(系统名称:“减号”)
})
.disabled($viewModel.dataStore.selection.wrappedValue.count==0)
文本(“选择\($viewModel.dataStore.Selection.wrappedValue.count)”)
}
}
}
结构模型列表:视图{
@绑定公共var数据存储:数据存储
var body:一些观点{
List.init(dataStore.models,
id:\.id,
选择:$dataStore.selection){
文本(“名称:\($0.Name)”)
}
}
}
类ViewModel:ObservableObject{
@已发布的var数据存储:数据存储=数据存储()
init(){
打印(“视图模型”)
}
}
类数据存储:observeObject{
@已发布的公共var selection=Set()
@已发布的公共var模型=[模型(id:1,名称:“第一”)]
init(){
打印(“数据存储”)
}
}
结构模型:可识别、可平衡{
让id:Int
let name:String
}
@主要
结构层应用程序:应用程序{
var body:一些场景{
窗口组{
ContentView(viewModel:viewModel())
}
}
}

在提供的代码中,我看不到两种变体的行为有任何差异。你包括所有的代码吗?是的,所有的都包括在内。在VStack中,注释掉ModelList行并启用List.init行。是的,我这样做了
注释掉ModelList行并启用List.init行
-结果相同。Xcode 12.1/iOS 14.1。发送视频时请挂起。@asperi视频已准备就绪。Xcode版本12.2(12B45b)