Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot find 'entity' in scope SwiftUI

Tags:

swift

swiftui

I'm trying to display the detail of an item from a list on to a sheet. I'm getting this error Cannot find 'entity' in scope even though it's declared in the detail item struct.

This error doesn't appear if the sheet is inside of the list BUT this causes only the first item detail to be shown even if you select any of the other items below the first.

This is a macOS app.

                @StateObject var vm = CoreDataViewModel()

                  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: {showingDetailScreen.toggle()}) {
                            Label("Details", systemImage: "pencil")
                                     }.foregroundColor(Color(.red))                       
                        }                          
                    }// list ends here                
                    .sheet(isPresented: $showingDetailScreen) {
                        DetailItemView(entity: entity,isVisible: self.$showingDetailScreen)
                           }
                }
            

Detail Item View Struct

struct DetailItemView: View  {
        var entity: MemoryEntity
        @Environment(\.presentationMode) var presentationMode
        @Binding var isVisible: Bool
        
 
        var body: some View {
            Text(entity.name ?? "No Name")
            HStack {
            Button("Exit") {
                self.isVisible = false
                   }
            }
            .frame(width: 300, height: 150)
            }
    }

ViewModel

class CoreDataViewModel: ObservableObject {
    let container: NSPersistentContainer
    @Published var savedEntites: [MemoryEntity] = []
    @Published var selectedEntity: String = ""
    init() {
        container = NSPersistentContainer(name: "MemoryContainer")
        container.loadPersistentStores { (description, error) in
            if let error = error {
              print("Error loading CoreData. \(error)")
        }
        }
        FetchMemories()
    }
    
    func FetchMemories() {
        let request = NSFetchRequest<MemoryEntity>(entityName: "MemoryEntity")
        do {
        savedEntites = try container.viewContext.fetch(request)
        } catch let error {
            print("Error fetching \(error)")
        }
    }   
   
    }
like image 551
swiftnoob Avatar asked Sep 01 '25 16:09

swiftnoob


1 Answers

The scope of entity is inside ForEach brackets,

ForEach(vm.savedEntites) { entity in
                                                                                
} //End scope entity var

If you want to show a present outside ForEach, as a suggestion you could declare in your viewModel a selectedEntity as @Published

List {
   ForEach(vm.savedEntites) { entity in
   Button(action: {
       vm.selectedEntity = entity
       showingDetailScreen.toggle()
   }) {
}
.sheet(isPresented: $showingDetailScreen) {
   DetailItemView(entity: vm.selectedEntity,isVisible: self.$showingDetailScreen)
}
like image 117
dig Avatar answered Sep 04 '25 10:09

dig