SwiftUI NavigationView, going back if NavigationLink is inside a NavigationBarItem

女生的网名这么多〃 提交于 2020-12-15 06:48:29

问题


As there are some problems with iOS 13.4 and Xcode 11.4 with presentationMode.wrappedValue.dismiss() I am looking for an alternative approach to go back programmatically. I found this solution from MScottWaller:

iOS SwiftUI: pop or dismiss view programmatically

Unfortunately, in my case it does not work:

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")
        }
    }
}

If the NavigationLink is inside a navigationBarItem, I can't go back from my DetailView. I don't know if it is a bug or there are other reasons why NavigationLink does not work in the same way inside a navigationBarItem.

As a workaround I use this variant with a empty NavigationLink inside the view. It works, but I don't like this:

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

Any ideas why the NavigationLink does not correct work inside a navigationBarItem?


回答1:


It's an iOS bug.

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

The work around is to toggle a NavigationLink hidden outside of nav bar:

 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") })  
        }  
    }  
}  


来源:https://stackoverflow.com/questions/60095039/swiftui-navigationview-going-back-if-navigationlink-is-inside-a-navigationbarit

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!