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 位于 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 内正确工作?

4

1 回答 1

3

这是一个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") })  
        }  
    }  
}  
于 2020-06-10T23:13:00.590 回答