SwiftUI疑问:创建的View数量超出预期是否为正常行为?
问题代码与现象
给定以下SwiftUI代码:
import SwiftUI struct ContentView: View { var body: some View { NavigationView { VStack { ForEach(0..<3) { index in NavigationLink(destination: TestView(index)) { Text("Hello, world!") } } } } } } struct TestView: View { let id = UUID() init(_ index: Int) { print("\(id) \(index)") } var body: some View { Text("Hello world!") } }
预期控制台会打印3行日志,但实际输出6行——每个索引对应2次初始化,且每次初始化的TestView实例id都不相同。
疑问:这种重复初始化的现象是否属于SwiftUI的预期行为?
更新:当把NavigationView替换为NavigationStack时,每个索引对应的初始化次数变为4次!
补充验证与发现
添加验证代码后:
struct ContentView: View { static var indices = Set<Int>() var body: some View { NavigationView { VStack { ForEach(0..<3) { index in NavigationLink(destination: generateTestView(index) as? TestView) { Text("Hello, world!") } } } } } func generateTestView(_ index: Int) -> any View { if !Self.indices.contains(index) { Self.indices.insert(index) return EmptyView() } return TestView(index) } }
实际测试发现:点击NavigationLink后,跳转的目标是TestView而非EmptyView,说明SwiftUI最终使用的是最后一次创建的视图实例。
内容的提问来源于stack exchange,提问作者1058u4
相关产品推荐
相关产品推荐

