我正在使用 SwiftUI 制作 Mac 应用程序。
我有一个简单的 2 列导航视图。 第一个视图是包含列表的侧边栏,第二个视图是详细视图。
(我知道NavigationView已被弃用,但我目前无法使用NavigationSplitView。)
当我启动应用程序时,将为列表的每一行调用详细视图上的 init 函数(在下面的玩具示例中,init 1-10 被打印到控制台)。 这是预期的行为还是我做错了什么?在我的真实应用程序中,init 用于创建核心数据获取请求,因此不必要地多次调用它是不可取的。
import SwiftUI
struct ContentView: View {
var body: some View {
NavigationView {
SidebarView()
EmptyView()
}
}
}
struct SidebarView: View {
var body: some View {
List{
ForEach((1...10), id: \.self){ i in
NavigationLink{
DetailView(myVar: i)
} label: {
Text("myVar \(i)")
}
}
}
}
}
struct DetailView: View {
@State var preVar:Int
init(myVar: Int) {
let _ = print("init \(myVar)")
self.preVar = myVar
}
var body: some View {
Text("Hello, World!")
}
}
这是预期的行为,但只调用了
init
,所以它非常轻量级。
body
var 仅在显示视图时调用。
使用新的 iOS 16
NavigationStack
时不会发生这种情况,如下:
struct ContentView: View {
@State private var path = NavigationPath()
var body: some View {
NavigationStack(path: $path) {
SidebarView(path: $path)
EmptyView()
}
}
}
struct SidebarView: View {
@Binding var path: NavigationPath
var body: some View {
List{
ForEach((1...10), id: \.self){ i in
NavigationLink("myVar \(i)", value: i)
}
}
.navigationDestination(for: Int.self) { i in
DetailView(myVar: i)
}
}
}