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

SwiftUI中首次弹出Sheet时@State变量selectedItem为何为空?

问题原因

这是因为SwiftUI里用.sheet(isPresented:)时,sheet的内容视图会在父视图首次渲染时就被预创建,它捕获的是当时selectedItem的初始值(也就是nil)。

虽然你在按钮动作里先给selectedItem赋值再把showSheet设为true,但SwiftUI的状态更新是批量处理的——这两个状态变更会被合并成一次视图更新。而首次触发sheet时,预创建的sheet内容视图还没来得及捕获到更新后的selectedItem值,所以就显示了默认的"item was null"。

后续点击时,sheet已经被创建过,状态更新能正确同步,所以就能正常显示选中项了。

解决方法

改用.sheet(item:)的绑定方式,这种方式会直接基于选中的item来驱动sheet的展示,能确保sheet内容始终和最新的选中项同步:

struct TestView: View {
    @State private var selectedItem: String?
    
    var body: some View {
        List {
            Button(action: {
                selectedItem = "Item 1"
            }, label: { Text("Item 1") })
            Button(action: {
                selectedItem = "Item 2"
            }, label: { Text("Item 2") })
            Button(action: {
                selectedItem = "Item 3"
            }, label: { Text("Item 3") })
        }
        .sheet(item: $selectedItem) { item in
            Text(item)
        }
    }
}

// 给String扩展Identifiable协议,满足sheet(item:)的类型要求
extension String: Identifiable {
    public var id: String { self }
}

如果不想扩展String,也可以自定义一个遵循Identifiable的类型来存储选中项,效果完全一致。

内容的提问来源于stack exchange,提问作者Falco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 11:11:08