NavigationView 中的列表正在为每一行调用 init

问题描述 投票:0回答:1

我正在使用 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!")
    }
}
macos swiftui swiftui-navigationview
1个回答
1
投票

这是预期的行为,但只调用了

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)
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.