所以我在try 弹出当前屏幕时遇到了关于SwiftUI中的NavigationViewNavigationLinks的问题,在这种情况下不起作用.

我有3个屏幕A->B-&>C

每个屏幕都有一个弹出按钮.

来自B->A的POP正常,但当你从A->B-&>C导航时,来自C-&>B的POP不起作用.

你知道会有什么问题吗?我会附上下面的代码和一段视频. 该应用程序应该支持iOS 14.

enter image description here

struct ScreenA: View {
    @State private var showB = false
    
    var body: some View {
        NavigationView {
            VStack {
                Button("Go to B") {
                    showB = true
                }
                
                NavigationLink(destination: ScreenB(didTapGoBack: {
                    showB = false
                }), isActive: $showB) {
                    EmptyView()
                }
            }
        }
    }
}
struct ScreenB: View {
    var didTapGoBack: () -> Void
    @State var showC = false

    var body: some View {
        VStack {
            Button("Go to C") {
                showC = true
            }
        
            Button("Back to Screen A") {
                didTapGoBack()
            }
            
            NavigationLink(destination: ScreenC(didTapGoBack: {
                showC = false
            }), isActive: $showC) {
                EmptyView()
            }
        }
    }
}
struct ScreenC: View {
    var didTapGoBack: () -> Void
    
    var body: some View {
        VStack {
            Text("Screen C")
            Button("Back to Screen B") {
                didTapGoBack()
            }
        }
    }
}
@main
struct TestNavApp: App {
    var body: some Scene {
        WindowGroup {
            ScreenA()
        }
    }
}

推荐答案

因此,一个解决方案是在第一个NavigationLink上添加.isDetailLink(false),也许NavigationView在默认情况下是像Master-Detail一样的拆分导航,所以也许这就是第一个弹出窗口起作用的原因,但通过添加这个,您就告诉NavigationView像一个堆栈一样工作.

现在,导航按预期工作A-&>B-&>C:

struct ScreenA: View {
    @State private var showB = false
    
    var body: some View {
        NavigationView {
            VStack {
                Button("Go to B") {
                    showB = true
                }
                
                NavigationLink(destination: ScreenB(didTapGoBack: {
                    showB = false
                }), isActive: $showB) {
                    EmptyView()
                }.isDetailLink(false)
            }
        }
    }
}

Ios相关问答推荐

带外部笔划的圆形进度视图

preferredCompactColumn作为NavigationSplitViewColumn.sidebar传递,但仍能在iOS上看到详细信息页面

在iOS 17脉冲符号效果不起作用的情况下制作UIBarButtonItem动画(没有UIImageView)

如何解释在SwiftUI视图中观察到持续的数据更改

SwiftUI标题/标题文本背景 colored颜色 屏幕宽度

如何在expo-react native中从ios平台中排除包

为什么下面的代码没有在主线程上运行?

如何在 Flutter 应用程序中测试来自 App/Play Store 的移动深层链接?

如何结合`@dynamicMemberLookup`和`ExpressibleByStringInterpolation`来实现方法链?

在 iOS 上启用明文本地流量在 .NET MAUI 中不起作用

Toast 不显示 Flutter

SwiftUI 中的描边图像边框

滚动 swiftUI 列表时,未调用单元格的任务修饰符.怎么修?

错误:无法根据成员environmentObject推断上下文基础

从父母到子元素的 Swift Pass 事件

在 Swift 中按下返回键时在文本字段之间切换

每次运行后,Xcode 6 都会在 iOS8 模拟器中重命名我的应用程序目录.

通过 segue 传递数据

swift 语言中的 null / nil

如何在ios中生成UUID