SwiftUI NavigationStack:目标未显示,但再次显示相同视图

ljsrvy3e  于 5个月前  发布在  Swift
关注(0)|答案(1)|浏览(51)

在下面的示例应用程序中,为什么点击“第二目的地”后,同一屏幕再次显示,而不是实际显示SecondDestination

struct ContentView: View {
    var body: some View {
        NavigationStack {
            NavigationLink { 
                FirstDestination()
            } label: { 
                Text("First Destination")
            }

        }
    }
}

struct FirstDestination: View {
    var body: some View {
        NavigationLink("Second Destination", value: "my name").navigationDestination(for: String.self) { name in
            SecondDestination(name: name)
        }
    }
}

struct SecondDestination: View {
    
    let name: String
    
    var body: some View {
        Text(name)
    }
}

字符串

g0czyy6m

g0czyy6m1#

问题是你混合了两种不同的导航方法,“旧”的是NavigationLink(destination:),“新”的是NavigationLink(value:)
混合使用这两种方法 * 是行不通的 *。你必须决定是只使用直接定义目的地的链接,还是使用定义值然后为值定义.navigationDestination(for:)的链接。

说明:

要理解为什么不能混合使用这些方法,可以看看NavigationStack,以及当您提供path作为输入时它可以做什么:NavigationStack(path: $path)。[即使您没有显式定义它,SwiftUI也会在内部完成。]
path是表示导航路径的值的集合。它包含通过NavigationLink(value:)压入堆栈的所有valuespath中的每个值表示一个视图,在NavigationStack中的一个导航级别,您可以通过向/添加或删除元素来与代码中的导航进行交互。从path和用户界面将相应地调整。
但是,如果您在某个地方也使用了NavigationLink(destination:),那么当用户点击该链接时,value会添加到path中吗?答案是:none. * 没有值 *.那个NavigationLink只定义了一个目标视图,所以SwiftUI会尽量展示目标视图,但是不能在path上添加任何内容。
因此,如果您尝试从path中删除最后一个元素,您将不会删除“堆栈上的最后一个视图”,而是倒数第二个视图。同样,如果您尝试向path添加某些内容,SwiftUI无法真正将其置于当前呈现的视图之上,因为该视图根本不存在于path中。结果是显示新添加的视图,但是在您通过NavigationLink(destination:)导航到的视图的“下方”。
我希望这能帮助你理解为什么你不能混合使用这两种方法。

相关问题