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进行测试。