【问题标题】:Dismiss of SwiftUI Views one after the other programmatically does not work以编程方式一个接一个地关闭 SwiftUI 视图不起作用
【发布时间】: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")
    }
}

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

【问题讨论】:

    标签: ios swift swiftui


    【解决方案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)
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-24
      • 1970-01-01
      • 1970-01-01
      • 2020-11-05
      • 2015-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多