【问题标题】:SwiftUI NavigationView, going back if NavigationLink is inside a NavigationBarItemSwiftUI NavigationView,如果 NavigationLink 在 NavigationBarItem 内,则返回
【发布时间】:2020-05-22 12:05:07
【问题描述】:

由于带有presentationMode.wrappedValue.dismiss() 的 iOS 13.4 和 Xcode 11.4 存在一些问题,我正在寻找一种以编程方式返回的替代方法。我从 MScottWaller 找到了这个解决方案:

iOS SwiftUI: pop or dismiss view programmatically

不幸的是,在我的情况下它不起作用:

struct MasterView: View {
    @State private var showDetail = false

    var body: some View {
        VStack {
            Text("MasterView")
            .navigationBarItems(trailing: HStack {
                NavigationLink(destination: DetailView(showSelf: $showDetail), isActive: $showDetail) {
                    Image(systemName: "tag")
                        .padding(.leading, 4)
                }
            })
        }
    }
}

struct DetailView: View {
    @Binding var showSelf: Bool

    var body: some View {
        Button(action: {
            self.showSelf = false
        }) {
            Text("Pop")
        }
    }
}

如果 NavigationLink 位于 navigationBarItem 内,我无法从 DetailView 返回。我不知道这是一个错误还是其他原因导致 NavigationLink 在 navigationBarItem 中无法以相同的方式工作。

作为一种解决方法,我在视图内使用带有空 NavigationLink 的这个变体。它有效,但我不喜欢这样:

struct MasterView: View {
    @State private var showDetail = false

    var body: some View {
        VStack {
            Text("MasterView")
            NavigationLink(destination: DetailView(showSelf: $showDetail), isActive: $showDetail) {
                EmptyView()
            }
            .navigationBarItems(trailing: HStack {
                Button(action: { self.showDetail.toggle() }) {
                    Image(systemName: "tag")
                        .padding(.leading, 4)
                }
            })
        }
    }
}

任何想法为什么 NavigationLink 不能在 navigationBarItem 内正确工作?

【问题讨论】:

  • 你是在真机上测试吗?
  • 根据我对NavigationView/NavigationLink API 描述(和实际行为观察)的理解,后者必须在导航堆栈层次结构中,而NavigationBar上方导航堆栈。跨度>
  • 您确定在 navigationBarItems 中使用 NavigationLink 是合适的或受支持的用例吗?
  • @Asperi 这是可能的,但为什么 NavigationLink 完全可以在 NavigationBar 中工作?

标签: swiftui-navigationlink swiftui


【解决方案1】:

这是一个 iOS 错误。

https://forums.developer.apple.com/thread/125937

解决方法是切换隐藏在导航栏外的 NavigationLink:

 struct Parent: View {  

    @State private var showingChildView = false  

    var body: some View {  
        NavigationView {  
            VStack {  
                Text("Hello World")  
                NavigationLink(destination: Child(),  
                               isActive: self.$showingChildView)  
                { Text("HiddenLink").hidden() }
            }  
            .navigationBarItems(trailing: Button(action:{ self.showingChildView = true }) { Text("Next") })  
        }  
    }  
}  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    • 2023-04-07
    • 2020-10-04
    相关资源
    最近更新 更多