SwiftUI:删除模型时如何弹出详图视图

SwiftUI:删除模型时如何弹出详图视图,swiftui,Swiftui,考虑一个相当简单的SwiftUI应用程序:一个显示模型列表的列表视图,其中每一行都是指向详细视图的导航链接。使用SwiftUI,对当前查看模型的任何更改都会自动生成更新的UI;详图视图始终显示模型的最新版本。万岁 但是,当您在详图视图上时删除模型时会发生什么情况?这不起任何作用,只保留在细节视图上。请参见下面的一个非常简单的示例,它确实说明了问题: 结构模型:可识别{ 让id:Int 变量标题:字符串 } 类存储:observeObject{ @已发布的var模型=[Modelid:0,titl

考虑一个相当简单的SwiftUI应用程序:一个显示模型列表的列表视图,其中每一行都是指向详细视图的导航链接。使用SwiftUI,对当前查看模型的任何更改都会自动生成更新的UI;详图视图始终显示模型的最新版本。万岁

但是,当您在详图视图上时删除模型时会发生什么情况?这不起任何作用,只保留在细节视图上。请参见下面的一个非常简单的示例,它确实说明了问题:

结构模型:可识别{ 让id:Int 变量标题:字符串 } 类存储:observeObject{ @已发布的var模型=[Modelid:0,title:a] } 结构列表视图:视图{ @EnvironmentObject私有变量存储:存储 var body:一些观点{ 导航视图{ Liststore.models{中的模型 NavigationLinkdestination:DetailViewmodel:model{ Textmodel.title } } .navigationBarTitleList } } } 结构详细视图:视图{ @EnvironmentObject私有变量存储:存储 var模型:模型 var body:一些观点{ Textmodel.title .导航BartitleDetail .navigationBarItemstrailing:跟踪NavigationBarItems } 私有var trailingNavigationBarItems:一些视图{ HStack{ 按钮更改标题{ self.store.models[0]。title=AAA } 按钮删除模型{ self.store.models.removeat:0 } } } } 详图视图如何识别其模型不再存在并弹出回列表视图?正如我所说的,现在您只剩下细节视图,查看一个真正不存在的模型。手动返回列表时,该列表将更新,模型将消失

如果要运行此代码,只需使用ListView.environmentObjectStore作为SceneDelegate中的根视图


在任何人说我可以弹出删除按钮操作之前,这个按钮就是用来演示问题的。实际上,例如,模型可以在服务器上删除,因此不是通过从“详细信息”视图启动的操作来删除的。

我会这样解决问题。例如,如果我想知道模型是否没有内容,我会通过编程方式弹出当前视图,自动返回列表视图。它是有效的

struct DetailView: View {
  @EnvironmentObject private var store: Store
  @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>

  var model: Model

  var body: some View {
    ZStack {
        Text(model.title)
    }
    .navigationBarTitle("Detail")
    .navigationBarItems(trailing: trailingNavigationBarItems)
    .onReceive(self.store.$models) { model in
        if model.count == 0 {
            self.presentationMode.wrappedValue.dismiss()
        }
    }
  }

好吧,如果我是这样一个应用程序的用户,我在屏幕上读到一些细节,然后突然在没有我干预的情况下返回,这会让我非常困惑。虽然有技术上的可能性可以做到这一点,但我不推荐这样的行为,而且这似乎是一种违法行为。这是有道理的,除非在我的情况下,该模型可以由用户自己在不同的设备上删除,然后再同步。