SwiftUI NavigationView,如果NavigationLink在NavigationBarItem里面,则返回。

问题描述 投票:0回答:1

由于iOS 13.4和Xcode 11.4存在一些问题,用 presentationMode.wrappedValue.dismiss() 我正在寻找另一种方法来回溯编程。我从MScottWaller那里找到了这个解决方案。

iOS SwiftUI:程序化地弹出或驳回视图。

不幸的是,在我的情况下,它不能工作。

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在导航条项目中,我就不能从我的DetailView返回。我不知道这是一个bug,还是有其他原因导致NavigationLink在导航条项目中不能以同样的方式工作。

作为一个变通方法,我使用了这个变体,在视图中使用一个空的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里面正常工作?

swiftui swiftui-navigationlink swiftui-bug
1个回答
0
投票

这是一个iOS的bug。

https:/forums.developer.apple.comthread125937。

解决办法是在导航栏外隐藏一个导航链接。

 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") })  
        }  
    }  
}  
热门问题
推荐问题
最新问题