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