如何修复Xcode 14警告:NavigationLink呈现的值必须出现在基于NavigationContent的NavigationView内。链接将被禁用。

16

自从安装Xcode 14以来,我在控制台中打印了以下错误消息:

NavigationLink presenting a value must appear inside a NavigationContent-based NavigationView. Link will be disabled.

我的应用程序的结构如下:

  1. 我在一个NavigationView中包含视图A。NavigationView内有一个导航链接,链接到视图B。

  2. 我有一个没有NavigationView但具有导航链接到视图C的View B。View B继承了在View A中定义的NavigationView

当我按下返回按钮回到View A时,警告会被打印出来。 将View B包装在NavigationView中可以消除这个警告,但这样显示View B在两个NavigationView中,这不是我想要的。

我不确定为什么会打印这个警告,因为View B继承了在View A中定义的NavigationView。


2
如果没有提供最小可重现例(MRE),仅凭描述不太可能对其进行调试。 - jnpdx
4个回答

16

我之前也遇到了同样的问题。加入一个检查条件,判断是否为iOS16版本,并且如果是,则使用新的导航堆栈来解决问题。

WindowGroup {
    if #available(iOS 16.0, *) {
        NavigationStack {
            ContentView()
        }
    } else {
        // Fallback on earlier versions
        NavigationView {
            ContentView()
        }
    }
}

9
尝试将 .navigationViewStyle(.stack) 添加到 NavigationView 中。在我的情况下,它很有帮助。
NavigationView {
    // View A
}
.navigationViewStyle(.stack)

1

1
您应该引用文档中的重要部分,并留下参考链接。请参见(如何撰写一个好的答案)。 - Gavin Morrow

0
它并不是非常聪明,但足够聪明以纠正苹果的用户不友好的修改。
struct SmartNavigationView<Content>: View where Content: View {
    @ViewBuilder var content: () -> Content

    var body: some View {
        if #available(iOS 16, *) {
            NavigationStack(root: content)
        } else {
            NavigationView(content: content)
                .navigationViewStyle(.stack)
        }
    }
}

使用方法

var body: some View {
    SmartNavigationView {
        NavigationLink {
            Text("Perhaps it's because they lack faith in using SwiftUI for serious projects.")
        } label: {
            Text("Why did SwiftUI developers implement these types of changes?")
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接