@State var基于Picker选择更改时,一个视图不会重新呈现

时间:2020-01-31 16:48:54

标签: ios swift macos swiftui

尝试使用SwiftUI构建简单的MacOS应用。我有一个视图,其中包含绑定到State var的Picker。作为健全性检查,我添加了一个文本视图(矮人视图和卷... itemName),该视图也应随着Picker的更改而更改。它们确实可以,但是我要重新渲染的视图(文件列表)却没有。

我怀疑这与我试图将新的FileSystemItem(内部类)传递给FileList的方式有关。就像当FilePanel重新渲染时一样,volumeSelection返回到0,然后状态被应用。所以我的问题是,我似乎缺少有关该数据如何流动的基本概念。我再次浏览了WWDC的信息,并在阅读其他文章,但没有找到答案。

所需的行为是更改选择器上的选择,这应使新的FileSystemItem显示在FileList视图中。使这种情况发生的正确方法是什么?为了更一般地,怎么你会得到一个子视图来显示新的数据状态,它当一个选择器选择更改?

struct FilePanel: View 
{
    @State var volumeSelection = 0
    @State var pathSelection = 0

    var volumes = VolumesModel() //should be passed in?
    var dwarves = ["Schlumpy","Wheezy","Poxxy","Slimy","Pervy","Drooly"]

    var body: some View {
        VStack {
            Picker(selection: $volumeSelection, label:
                Text("Volume")
                , content: {
                    ForEach (0 ..< volumes.count()) {
                        Text(self.volumes.volumeAtIndex(index: $0).itemName).tag($0)
                    }
            })

            FileList(item:volumes.volumeAtIndex(index: volumeSelection)).frame(minWidth: CGFloat(100.0), maxHeight: .infinity)
            Text(dwarves[volumeSelection])
            Text(volumes.volumeAtIndex(index: volumeSelection).itemName)

        }
    }
 }

struct FileList: View {
    @State var item : FileSystemItem

    var body: some View {
        VStack {
        List(item.childItems){fsi in
            FileCell(expanded:false, item: fsi)
        }
        Text(item.itemName)
        }
    }
}

1 个答案:

答案 0 :(得分:0)

@State是拥有视图专用的状态,FileList永远不会看到任何更改。

如果VolumesModel是一个简单的结构,可能已经将FileList.item变成绑定(输入输出状态)(调用者在传递时仍需要将@State变成绑定使用$将其发送给受抚养人:

struct FileList: View {
  @Binding var item : FileSystemItem
  ...
}

但是,似乎VolumesModel是一个具有成员数组的更复杂的对象。

如果是这种情况,上述内容将无法满足要求:

  • VolumesModel必须是采用ObservableObject
  • 的类
  • VolumesModel的重要成员需要一个可绑定的包装器(@Published
  • FileList.item应该变成@ObservedObject(而不是@State或@Binding)
  • FilePanel.volumes也将被@ObservedObject包装

希望能帮助您或至少将您指向正确的方向。