ScrollView 中的 ForEach 在交互之前不会更新
ForEach in ScrollView not updating until interaction
添加到数组或从数组中删除时,除非用户与 ScrollView
交互,否则视图不会更新。
Model
是一个 ObservableObject
,它在应用程序生命周期的早期被声明为 StateObject
,然后作为 EnvironmentObject
传递。
数据只是一个带有对象数组的自定义 Profile
对象,添加到 store.profile!.tasks.append()
或从视图中删除时不会更新,除非用户滚动 ScrollView;我的意思是字面上的 1 个像素。
我试过的
- 将 ForEach 包装在 LazyVStack 或 VStack 中
- 在 VStack 中包装 NavigationLink
- 确保尺寸为全高以防需要重新计算
代码
class Profile: Identifiable, Codable, Equatable
var tasks: [Task]
}
struct Task: Identifiable, Codable, Equatable {
var createdBy: String
var title: String
var date: Date
}
class Store : ObservableObject {
@Published var profile: Profile?
}
struct ListView: View {
@EnvironmentObject var store: Store
var body: some View {
GeometryReader { geometry in
ZStack(alignment: .bottomTrailing) {
ScrollView(.vertical, showsIndicators: false){
ForEach(store.profile!.tasks.filter({ return [=10=].createdBy == store.profile!.uid}).indices, id: \.self) { index in
NavigationLink(destination: DetailView().environmentObject(store)) {
TasksRow().id(UUID())
}
}
}
.frame(maxWidth: geometry.size.width, alignment: .center)
.frame(maxHeight: geometry.size.height)
.background(Color.gray)
}
}
}
您的 Profile
是引用类型,因此当您在其中附加任务时,对配置文件的引用不会更改,因此已发布不起作用。
改用配置文件的值类型(即 struct
)
struct Profile: Identifiable, Codable, Equatable
var tasks: [Task]
}
现在将任务附加到配置文件将更改配置文件本身,发布者发送事件和视图将刷新。
添加到数组或从数组中删除时,除非用户与 ScrollView
交互,否则视图不会更新。
Model
是一个 ObservableObject
,它在应用程序生命周期的早期被声明为 StateObject
,然后作为 EnvironmentObject
传递。
数据只是一个带有对象数组的自定义 Profile
对象,添加到 store.profile!.tasks.append()
或从视图中删除时不会更新,除非用户滚动 ScrollView;我的意思是字面上的 1 个像素。
我试过的
- 将 ForEach 包装在 LazyVStack 或 VStack 中
- 在 VStack 中包装 NavigationLink
- 确保尺寸为全高以防需要重新计算
代码
class Profile: Identifiable, Codable, Equatable
var tasks: [Task]
}
struct Task: Identifiable, Codable, Equatable {
var createdBy: String
var title: String
var date: Date
}
class Store : ObservableObject {
@Published var profile: Profile?
}
struct ListView: View {
@EnvironmentObject var store: Store
var body: some View {
GeometryReader { geometry in
ZStack(alignment: .bottomTrailing) {
ScrollView(.vertical, showsIndicators: false){
ForEach(store.profile!.tasks.filter({ return [=10=].createdBy == store.profile!.uid}).indices, id: \.self) { index in
NavigationLink(destination: DetailView().environmentObject(store)) {
TasksRow().id(UUID())
}
}
}
.frame(maxWidth: geometry.size.width, alignment: .center)
.frame(maxHeight: geometry.size.height)
.background(Color.gray)
}
}
}
您的 Profile
是引用类型,因此当您在其中附加任务时,对配置文件的引用不会更改,因此已发布不起作用。
改用配置文件的值类型(即 struct
)
struct Profile: Identifiable, Codable, Equatable
var tasks: [Task]
}
现在将任务附加到配置文件将更改配置文件本身,发布者发送事件和视图将刷新。