SwiftUI 列表内容通过选择重置
SwiftUI List content gets reset with selection
这是我的问题: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
}
如果我不使用环境对象没有问题,但不明白这是如何导致列表重置的。
您修改 MainViewModel
并导致重建正文,包括 ChildView
。
如果您将 iOS 14 作为目标最小支持系统,最简单的解决方案是使用 StateObject
,因为它会保留视图数据
struct ChildView : View {
@StateObject var cm = ChildViewModel() // << here !!
// ... other code
这是我的问题: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
}
如果我不使用环境对象没有问题,但不明白这是如何导致列表重置的。
您修改 MainViewModel
并导致重建正文,包括 ChildView
。
如果您将 iOS 14 作为目标最小支持系统,最简单的解决方案是使用 StateObject
,因为它会保留视图数据
struct ChildView : View {
@StateObject var cm = ChildViewModel() // << here !!
// ... other code