以编程方式一个接一个地关闭 SwiftUI 视图不起作用

Posted

技术标签:

【中文标题】以编程方式一个接一个地关闭 SwiftUI 视图不起作用【英文标题】:Dismiss of SwiftUI Views one after the other programmatically does not work 【发布时间】:2020-11-22 19:21:04 【问题描述】:

我使用 Xcode 12.2 和 ios 构建目标 14.1。 我的 SwiftUI 应用程序存在一个问题,即一个接一个地关闭使用 NavigationLink 的视图不起作用。

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

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

最小可重现示例:

struct View1: View 
    @State var presentView2: Bool = false
    
    var body: some View 
        NavigationView 
            List 
                NavigationLink(
                    destination: View2(types: ["Exams"], presentView2: $presentView2),
                    isActive: $presentView2,
                    label: 
                        Text("View2")
                    )
            .listStyle(InsetGroupedListStyle())
            .navigationTitle("View1")
        
    

struct View2: View 
    var types: [String]
    @State var presentView3: Bool = false
    @Binding var presentView2: Bool
    
    var body: some View 
        List 
            Section 
                NavigationLink("View3", destination: View3(presentView3: $presentView3), isActive: $presentView3)
            
            
            Section 
                Button(action: self.presentView2 = false, label: 
                    Text("Dismiss")
                )
            
        
        .listStyle(InsetGroupedListStyle())
        .navigationTitle(LocalizedStringKey("View2"))
    

struct View3: View 
    @Binding var presentView3: Bool
    @State var presentView4: Bool = false
    @State
    var isAddViewPresented: Bool = false
    var body: some View 
        List 
            Section 
                NavigationLink("View4", destination: View4(presentView4: $presentView4), isActive: $presentView4)
            
            
            Button(action: presentView3 = false, label: 
                Text("Dismiss")
            )
        
        .listStyle(InsetGroupedListStyle())
        .navigationTitle("View3")
        .toolbar 
            ToolbarItem 
                Button(action: isAddViewPresented.toggle(), label: 
                    Label("Add", systemImage: "plus.circle.fill")
                )
            
        
        .sheet(isPresented: $isAddViewPresented, content: 
            Text("DestinationDummyView")
        )
    

struct View4: View 
    @Binding var presentView4: Bool
    
    var body: some View 
        List 
            Button(action: presentView4 = false, label: 
                Text("Dismiss")
            )
        
        .listStyle(InsetGroupedListStyle())
        .navigationTitle("View4")
    

有人对此有解决方案吗? 具体来说,我需要在我的应用程序中删除应用程序中的记录(首先是子项,然后是父项)。 感谢您的任何反馈和意见! ☺️☺️☺️

【问题讨论】:

【参考方案1】:

.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)

【讨论】:

以上是关于以编程方式一个接一个地关闭 SwiftUI 视图不起作用的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:以编程方式关闭警报

SwiftUI:以编程方式关闭工作表

以编程方式导航到 SwiftUI 中的新视图

SwiftUI 以编程方式从可表示返回到视图

如何以编程方式从 SwiftUI 列表中删除行并刷新列表视图?

关闭自定义模式/覆盖不更新 SwiftUI 中的视图内容