Swiftui 迅捷不';t更新第二个导航链接目标
我有一个列表,其中包含推送视图的行。该视图有另一个列表,该列表推送另一个视图。原始列表和第一个推送列表将在数据更改时更新。但是,最后一个视图在按下时不会更新。当我刷回视图时,视图不再更新,即使它曾经更新过 家庭视图>用户视图>项目视图 用户和项目是可识别的结构。我尝试过使它们可散列并使用Swiftui 迅捷不';t更新第二个导航链接目标,swiftui,swiftui-navigationlink,Swiftui,Swiftui Navigationlink,我有一个列表,其中包含推送视图的行。该视图有另一个列表,该列表推送另一个视图。原始列表和第一个推送列表将在数据更改时更新。但是,最后一个视图在按下时不会更新。当我刷回视图时,视图不再更新,即使它曾经更新过 家庭视图>用户视图>项目视图 用户和项目是可识别的结构。我尝试过使它们可散列并使用id:\.self,但这似乎也不起作用 类应用程序:可观察对象{ @已发布的变量用户=[User]() } 结构HomeView{ @环境对象变量app:app 变位体{ 名单{ 部分{ ForEach(app.
id:\.self
,但这似乎也不起作用
类应用程序:可观察对象{
@已发布的变量用户=[User]()
}
结构HomeView{
@环境对象变量app:app
变位体{
名单{
部分{
ForEach(app.users){中的用户
导航链接(目的地:用户视图(用户:用户)){
文本(用户名)
}
}
}
}
}
}
//当'app.users'更新时,更新正常
//从ItemView返回后停止更新
结构用户视图{
让用户:用户
变位体{
名单{
部分{
ForEach(user.items){item在
导航链接(目标:项目视图(用户:用户,项目:项目)){
文本(项目名称)
}
}
}
}
}
}
///app.users更新时不更新
结构项目视图{
让用户:用户
让项目:项目
变位体{
名单{
部分{
ForEach(item.details){详细信息见
文本(细节)
}
}
}
}
}
这是我做的测试,运行良好,一切都按预期更新
struct User: Identifiable {
var id: String
var name: String
var items: [Item]
}
struct Item: Identifiable {
var id: String
var name: String
var details: [String]
}
class App: ObservableObject {
@Published var users = [User]()
init() {
let items1 = [Item(id: UUID().uuidString, name: "item1", details: ["d1","d2"]), Item(id: UUID().uuidString, name: "item2", details: ["d3","d4"])]
let items2 = [Item(id: UUID().uuidString, name: "item3", details: ["e1","e2"]), Item(id: UUID().uuidString, name: "item4", details: ["e3","e4"])]
users.append(User(id: UUID().uuidString, name: "user1", items: items1))
users.append(User(id: UUID().uuidString, name: "user2", items: items2))
}
}
struct ContentView: View {
@ObservedObject var app = App()
var body: some View {
NavigationView {
List {
ForEach(app.users) { user in
NavigationLink(destination: UserView(user: user)) {
Text(user.name)
}
}
}
}
}
}
struct UserView: View {
@State var user: User
var body: some View {
List {
ForEach(user.items) { item in
NavigationLink(destination: ItemView(item: item)) {
Text(item.name)
}
}
}
}
}
struct ItemView: View {
@State var item: Item
var body: some View {
List {
ForEach(item.details, id: \.self) { 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])
}
}
}
}
struct ContentView:View{
@环境对象变量app:app
var body:一些观点{
导航视图{
列表(0..经过长时间的搜索,我找到了一些我在互联网上其他地方还没有看到的东西。我正在从父视图中使用@State初始化我的视图,并使用onReceive进行更新。此外,onReceive/onAppear检查该项是否仍然有效,如果需要,会弹出该视图。使用init设置状态和m可能更正确别出声
主要原因是删除导致了崩溃。下面是一个完整的示例,我用来测试更改和删除源代码
struct项:可识别{
变量id:String
变量名称:String
var账户:[账户]
}
结构帐户:可识别{
变量id:String
变量名称:String
}
类应用程序:ObserveObject{
@已发布的var项目:[项目]=[
项目(id:“a”,名称:“a”,账户:[
账户(id:“1”,名称:“1”),
账户(id:“2”,名称:“2”),
账户(id:“3”,名称:“3”)
])
]
}
结构RootView:View{
var body:一些观点{
导航视图{
ContentView().environmentObject(应用程序())
}
}
}
结构ContentView:View{
@环境对象变量app:app
var body:一些观点{
名单{
ForEach(app.items){item in
导航链接(目的地:项目视图(项目:项目)){
文本(“\(item.id)-\(item.name)”)
}
}
按钮(操作:{self.app.items[0].name=“XXX”}){
文本(“更改项目名称”)
}
按钮(操作:{self.app.items=[]}){
文本(“清晰”)
}
}
}
}
结构项目视图:视图{
@环境(\.presentationMode)变量presentationMode
@环境对象变量app:app
@状态变量项:项
var body:一些观点{
名单{
文本(“\(item.id)-\(item.name)”)
ForEach(项目.账户){
导航链接(目标:AccountView(项目:self.item,帐户:account)){
文本(“\(account.id)-\(account.name)”)
}
}
按钮(操作:{self.app.items[0].name=“XXX”}){
文本(“更改项目名称”)
}
按钮(操作:{self.app.items[0]。帐户[0]。name=“AAA”}){
文本(“更改帐户名称”)
}
按钮(操作:{self.app.items=[]}){
文本(“清晰”)
}
}
.onReceive(app.$items){中的项目
guard let item=items.first(其中:{$0.id==self.item.id})else{
self.presentationMode.wrappedValue.discouse()文件
返回
}
self.item=项目
}
奥纳佩尔先生{
if!self.app.items.contains(其中:{$0.id==self.item.id}){
self.presentationMode.wrappedValue.discouse()文件
}
}
}
}
结构AccountView:视图{
@环境(\.presentationMode)变量presentationMode
@环境对象变量app:app
@状态变量项:项
@状态变量帐户:帐户
var body:一些观点{
名单{
文本(“\(item.id)-\(item.name)”)
文本(“\(account.id)-\(account.name)”)
按钮(操作:{self.app.items[0].name=“XXX”}){
文本(“更改项目名称”)
}
按钮(操作:{self.app.items[0]。帐户[0]。name=“AAA”}){
文本(“更改帐户名称”)
}
按钮(操作:{self.app.items=[]}){
文本(“清晰”)
}
}
.onReceive(app.$items){中的项目
警卫
让item=items.first(其中:{$0.id==self.item.id}),
让account=item.accounts.first(其中:{$0.id==self.account.id})
否则{
self.presentationMode.wrappedValue.discouse()文件
返回
}
self.item=项目
self.account=帐户