我仍然是SwiftUI框架的新手,我正在学习HackingWithSwift for NavigationStack。我遵循了所有的步骤,唯一的区别就是我的代码结果。我运行没有任何错误,就像在视频中一样,但我无法导航到我的详细目的地。
struct ContentView: View {
var destinations = ["1", "2", "3", "4", "5", "6", "7", "8", "9"]
var body: some View {
NavigationStack {
List(destinations, id: \.self) { i in
NavigationLink(value: i) {
Label("Row \(i)", systemImage: "\(i).circle")
}
}
.navigationDestination(for: Int.self) { i in
Text("Detail \(i)")
}
.navigationTitle("Navigation")
}
}
}
我的模拟器显示带有标签的行列表,但我无法导航。这可能是偶然的错误,因为这仍然是新的。提前谢谢你。
发布于 2022-07-24 19:17:34
List
数据是一个String
数组,但.navigationDestination
值类型是Int
。
要解决问题,请修改.navigationDestination的数据类型,如下所示:
.navigationDestination(for: String.self) { I in //modify here
Text("Detail \(i)")
}
发布于 2022-07-25 03:32:02
对于静态的List
数组有特殊的Int
(和ForEach
)语法,如下所示:
struct NavTestView: View {
//let destinations = ["1", "2", "3", "4", "5", "6", "7", "8", "9"]
var body: some View {
NavigationStack {
List(1..<10) { i in
NavigationLink(value: i) {
Label("Row \(i)", systemImage: "\(i).circle")
}
}
.navigationDestination(for: Int.self) { i in
Text("Detail \(i)")
}
.navigationTitle("Navigation")
}
}
}
如果您继续需要一个动态数组,即添加或删除项,您真的不应该误用API与id:\.self
哈克,否则它会崩溃,您需要迁移到包含唯一标识符的属性的结构数组,甚至更好地将结构与提供id
属性供List
/ForEach
自动使用的Identifiable
保持一致,例如,
struct ListItem: Identifiable {
let id = UUID()
var number: Int
}
https://stackoverflow.com/questions/73103682
复制相似问题