You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI疑问:创建的View数量超出预期是否为正常行为?

SwiftUI中NavigationLink目标视图重复初始化的问题

问题代码与现象

给定以下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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 22:25:23