以编程方式逐一关闭 SwiftUI 视图不起作用

Ber*_*d_S 6 ios swift swiftui

我使用 Xcode 12.2 和 iOS 构建目标 14.1。\n我的 SwiftUI 应用程序存在问题,无法依次关闭使用 NavigationLink 的视图。

\n

当我第一次导航到 View4,单击“关闭”,然后在 View3 上再次单击“关闭”时,以下 Swift 源代码会出现问题。单击后一个按钮不会导致任何操作。要让 View3 的“关闭”按钮再次工作,我必须使用“后退”按钮转到 View2,然后切换回 View3。

\n

我之前尝试过使用presentationMode.wrappedValue.dismiss(),但是对于较少的视图来说这不起作用。

\n

最小可重复示例:

\n
struct View1: View {\n    @State var presentView2: Bool = false\n    \n    var body: some View {\n        NavigationView {\n            List {\n                NavigationLink(\n                    destination: View2(types: ["Exams"], presentView2: $presentView2),\n                    isActive: $presentView2,\n                    label: {\n                        Text("View2")\n                    })\n            }.listStyle(InsetGroupedListStyle())\n            .navigationTitle("View1")\n        }\n    }\n}\nstruct View2: View {\n    var types: [String]\n    @State var presentView3: Bool = false\n    @Binding var presentView2: Bool\n    \n    var body: some View {\n        List {\n            Section {\n                NavigationLink("View3", destination: View3(presentView3: $presentView3), isActive: $presentView3)\n            }\n            \n            Section {\n                Button(action: {self.presentView2 = false}, label: {\n                    Text("Dismiss")\n                })\n            }\n        }\n        .listStyle(InsetGroupedListStyle())\n        .navigationTitle(LocalizedStringKey("View2"))\n    }\n}\nstruct View3: View {\n    @Binding var presentView3: Bool\n    @State var presentView4: Bool = false\n    @State\n    var isAddViewPresented: Bool = false\n    var body: some View {\n        List {\n            Section {\n                NavigationLink("View4", destination: View4(presentView4: $presentView4), isActive: $presentView4)\n            }\n            \n            Button(action: {presentView3 = false}, label: {\n                Text("Dismiss")\n            })\n        }\n        .listStyle(InsetGroupedListStyle())\n        .navigationTitle("View3")\n        .toolbar {\n            ToolbarItem {\n                Button(action: {isAddViewPresented.toggle()}, label: {\n                    Label("Add", systemImage: "plus.circle.fill")\n                })\n            }\n        }\n        .sheet(isPresented: $isAddViewPresented, content: {\n            Text("DestinationDummyView")\n        })\n    }\n}\nstruct View4: View {\n    @Binding var presentView4: Bool\n    \n    var body: some View {\n        List {\n            Button(action: {presentView4 = false}, label: {\n                Text("Dismiss")\n            })\n        }\n        .listStyle(InsetGroupedListStyle())\n        .navigationTitle("View4")\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

有人有解决方案吗?\n具体来说,我需要在我的应用程序中使用它来从应用程序中删除记录(首先是孩子,然后是父母)。\n感谢您的任何反馈和意见!\xe2\x98\xba\xef\xb8\x8f\xe2\x98\xba\xef\xb8\x8f\xe2\x98\xba\xef\xb8\x8f

\n

Asp*_*eri 8

添加到您的视图中的.isDetailLink(false)每个...并且所有工作都有效。NavigationLink

演示


    NavigationLink(
        destination: View2(types: ["Exams"], presentView2: $presentView2),
        isActive: $presentView2,
        label: {
            Text("View2")
        }).isDetailLink(false)

...

    NavigationLink("View3", destination: View3(presentView3: $presentView3), isActive: $presentView3)
       .isDetailLink(false)


...

    NavigationLink("View4", destination: View4(presentView4: $presentView4), isActive: $presentView4)
       .isDetailLink(false)

Run Code Online (Sandbox Code Playgroud)