为什么NavigationStack和NavigationPath在路径追加时多次调用navigationDestina



navigationDestination在使用类型为(即:[String](的数组时被调用一次,但在追加后使用NavigationPath时被调用多次。

使用Text(string)上的断点进行检查,并切换路径类型。

测试对象:

  • iOS 16.1-Xcode 14.0&14.1
  • iOS 16.4.1-Xcode 14.3
  • iOS 16.5-Xcode 14.3

代码:

import SwiftUI
struct ContentView: View {

@State private var path = NavigationPath()
//    @State private var path = [String]()

var body: some View {
NavigationStack(path: $path) {
VStack {
Button("append") {
path.append("string")
}
}
.navigationDestination(for: String.self) { string in
Text(string) // <--- breakpoint here
}
}
}
}

这是Apple DTS工程师建议的一个变通方法,可能很有用(并不能解决所有情况,具体取决于您的导航/视图结构(。

import SwiftUI
struct Model: Hashable {
var intValue: Int
var stringValue: String

init(_ value: Int) {
intValue = value
stringValue = value.description
}
}
struct ContentView: View {
@State private var path = NavigationPath()
@State private var models: [Int: Model] = [:]

var body: some View {
NavigationStack(path: $path) {
VStack {
Button("append") {
path.append(Int.random(in: 0...100))
}
}
.navigationDestination(for: Int.self) { int in
let model = model(for: int)
Text(model.stringValue)
}
}
}

func model(for int: Int) -> Model {
if let string = models[int] {
return string // <--- breakpoint here
} else {
let model = Model(int)
models[int] = model
return model // <--- breakpoint here
}
}
}

它已修复!

使用Xcode 15和iOS 17的测试版8进行测试。

最新更新