1

这是我的问题:MainView显示ChildView并给它EnvironmentObject一个包含一组选定项目的内容。

ChildView显示可选项目列表(示例中为 2 个项目),并在出现时加载列表。

问题是ChildView当我点击任何行时,内容会重置为其原始值(示例中的 1 项)。

我试图使我的代码尽可能紧凑。

struct MainView: View {
        
    @ObservedObject var model = MainViewModel()
    
    var body: some View {
        NavigationView {
            ChildView().environmentObject(self.model)
        }
    }
}

class MainViewModel: ObservableObject {
    
    @Published var selection = Set<Stuff>()
    
    var formatted: String {
        return "\(self.selection.count)"
    }
}

struct ChildView : View {
    
    @ObservedObject var cm = ChildViewModel()
    
    @EnvironmentObject var model: MainViewModel
    
    var body: some View {
        VStack(spacing: 0) {
            List(cm.demoData, id: \.self, selection: $model.selection) { stuff in
                Text("\(stuff.value)")
            }
            .environment(\.editMode, .constant(EditMode.active))
            .onAppear(perform: cm.load)
        }
    }
}

class ChildViewModel : ObservableObject {
    
    @Published var demoData: [Stuff] = [Stuff(id: 1, value: "1")]
    
    func load() {
        self.demoData = [Stuff(id: 1, value: "1"), Stuff(id: 2, value: "2")]
    }

}

struct Stuff : Identifiable, Equatable, Hashable {
    var id: Int
    var value: String
}

如果我不使用环境对象没有问题,但不知道如何导致列表重置。

4

1 回答 1

1

您修改MainViewModel它会导致重建主体,包括ChildView.

如果您将 iOS 14 作为目标最小支持系统,最简单的解决方案是使用它,StateObject因为它保留了视图数据

struct ChildView : View {
    
    @StateObject var cm = ChildViewModel()     // << here !!

    // ... other code
于 2020-11-23T11:45:36.823 回答