SwiftUI macOS应用列表调Sheet提示Cannot find 'entity' in scope如何解决
问题原因
报错Cannot find 'entity' in scope
entity是ForEach循环内部的局部变量,你把sheet修饰符放在ForEach的闭合括号外,超出了entity的作用域,自然无法访问。
sheet放在ForEach内只显示第一条数据
所有循环生成的条目共用同一个showingDetailScreen布尔状态,触发状态变更时系统只会响应第一个匹配到的sheet。
解决方案
使用SwiftUI中sheet(item:)构造方法,直接绑定可选类型的选中实体,不需要单独维护布尔状态控制显隐,系统会自动在选中实体不为空时弹出sheet,并且自动传递选中的实体参数。
第一步:修改列表所在View的代码
首先新增可选类型的选中实体状态,替换原来的布尔状态,调整按钮点击逻辑和sheet修饰符:
@StateObject var vm = CoreDataViewModel() // 替换原来的showingDetailScreen布尔变量,用可选实体代替 @State private var selectedEntity: MemoryEntity? List { ForEach(vm.savedEntites) { entity in Text(entity.name ?? "No Name") .font(.system(size: 25)) HStack { Button(action: {vm.deleteMemory(entity: entity)}) { Label("Delete",systemImage: "trash") }.foregroundColor(Color(.red)) Button(action: { // 点击时给选中实体赋值 selectedEntity = entity }) { Label("Details", systemImage: "pencil") }.foregroundColor(Color(.red)) } } } // 用item版本的sheet,绑定可选选中实体 .sheet(item: $selectedEntity) { entity in // 这里的entity就是当前选中的实体,直接传给详情页 DetailItemView(entity: entity,isVisible: self.$showingDetailScreen) }
第二步(可选优化):简化DetailItemView的关闭逻辑
不用单独传显隐绑定,直接用系统提供的dismiss环境值,减少冗余参数:
struct DetailItemView: View { var entity: MemoryEntity // 引入系统dismiss环境变量 @Environment(\.dismiss) private var dismiss var body: some View { Text(entity.name ?? "No Name") HStack { Button("Exit") { // 直接调用dismiss关闭sheet dismiss() } } .frame(width: 300, height: 150) } }
调整完成后即可正常展示点击条目的对应详情,不会再出现作用域报错或数据错误问题。
内容的提问来源于stack exchange,提问作者swiftnoob
相关产品推荐
相关产品推荐

