我有一个列表,其中包含推送视图的行。该视图有另一个列表,它推动另一个视图。原始List和最先推送的List会在数据发生变化时更新。但是,最后一个视图在推送时不会更新。当我向后滑动时,视图不再更新,尽管它曾经更新过。
主页视图 > 用户视图 > 项目视图
用户和项目是可识别的结构。我尝试过使它们可哈希并使用id: \.self
,但这似乎也不起作用。
class App: ObservableObject {
@Published var users = [User]()
}
struct HomeView {
@EnvironmentObject var app: App
var body {
List {
Section {
ForEach(app.users) { user in
NavigationLink(destination: UserView(user: user)) {
Text(user.name)
}
}
}
}
}
}
// Updates fine when `app.users` updates
// Stops updating after going back from ItemView
struct UserView {
let user: User
var body {
List {
Section {
ForEach(user.items) { item in
NavigationLink(destination: ItemView(user: user, item: item)) {
Text(item.name)
}
}
}
}
}
}
/// Does not update when app.users updates
struct ItemView {
let user: User
let item: Item
var body {
List {
Section {
ForEach(item.details) { detail in
Text(detail)
}
}
}
}
}
好吧,我想我开始明白你想要什么了。像这样的事情怎么样:
struct ContentView: View {
@EnvironmentObject var app: App
var body: some View {
NavigationView {
List(0..<app.users.count) { i in
NavigationLink(destination: UserView(user: self.$app.users[i])) {
Text(self.app.users[i].name)
}
}
}
}
struct UserView: View {
@Binding var user: User
var body: some View {
List(0..<user.items.count) { i in
NavigationLink(destination:
ItemView(item: self.$user.items[i])) {
Text(self.user.items[i].name)
}
}
}
}
struct ItemView: View {
@Binding var item: Item
@State var hasChanged = false
var body: some View {
VStack {
Button(action: {
self.item.details.append(contentsOf: ["wx","wy"])
self.hasChanged.toggle()
}) {
Text("Add an item")
}
List(0..<item.details.count, id: \.self) { i in
Text(self.item.details[i])
}
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)