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
相关产品推荐
相关产品推荐

