Core data 警告:尝试在*上显示*已显示(空)SwiftUI

Core data 警告:尝试在*上显示*已显示(空)SwiftUI,core-data,view,swiftui,Core Data,View,Swiftui,我对iOS应用程序开发和SwiftUI都比较陌生,目前我正在开发一个应用程序,允许用户每周创建一个时间表 我最近修改了实体,使其也接受时间输入,以便列表根据计划的时间自行组织。以下是快速查看: 但是,当我单击每个项目时,它会将我发送到错误的事件 在UIKit中,我注意到这个问题主要是由于对多个视图的调用而普遍存在的,但是我看不到在哪里可以显示多个视图 主列表视图 List { ForEach(self.Events) { even

我对iOS应用程序开发和SwiftUI都比较陌生,目前我正在开发一个应用程序,允许用户每周创建一个时间表

我最近修改了实体,使其也接受时间输入,以便列表根据计划的时间自行组织。以下是快速查看:

但是,当我单击每个项目时,它会将我发送到错误的事件

在UIKit中,我注意到这个问题主要是由于对多个视图的调用而普遍存在的,但是我看不到在哪里可以显示多个视图

主列表视图

            List {
                    ForEach(self.Events) { event in
                        if("\(event.dotw ?? "Unknown")" == self.name) {
                            Button(action: {
                                self.isEvent.toggle()
                            }) {
                                HStack {
                                    Text("\(event.name ?? "Unknown")")
                                        .foregroundColor(Color.white)
                                    Spacer()
                                    Text("\(event.time ?? Date(), formatter: Self.taskDateFormat)")
                                }
                            }
                            .sheet(isPresented: self.$isEvent){
                                EventView(eventName: "\(event.name ?? "Unknown")", description:  "\(event.descript ?? "Unknown")", eventTime: (event.time ?? Date())).environment(\.managedObjectContext, self.managedObjectContext)
                            }
                            .buttonStyle(ItemButton())
                        }
                    }.onDelete { indexSet in
                        let deleteItem = self.Events[indexSet.first!]
                        self.managedObjectContext.delete(deleteItem)

                        do{
                            try self.managedObjectContext.save()
                        } catch {
                            print(error)
                        }
                    }
                    Button(action: {
                        self.isPresented.toggle()
                    }) {
                        HStack {
                            Text("new")
                            Spacer()
                        }
                    }
                    .buttonStyle(NewItemButton())
                    .sheet(isPresented:$isPresented) {
                        NewEventView(dotw: self.name).environment(\.managedObjectContext, self.managedObjectContext)
                }
            }
                .onAppear {
                    UITableView.appearance().separatorStyle = .none
                }.onDisappear {
                    UITableView.appearance().separatorStyle = .singleLine
                }
                .navigationBarHidden(true)
                .navigationBarTitle("")
                .edgesIgnoringSafeArea(.top)


        }
        .edgesIgnoringSafeArea(.top)
        .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .topLeading)
struct EventView: View {
    var eventName: String
    var description: String
    var eventTime: Date


    var body: some View {
        VStack {
            VStack {
                Image(systemName: "chevron.compact.down")
                        .foregroundColor(.white)
                        .imageScale(.large)
                    .padding()
                HStack {
                    Text(eventName)
                        .foregroundColor(.white)
                    .font(.largeTitle)
                    .padding(.top, 15)
                    .padding(.leading, 20)
                    Spacer()
                }

                .padding(.bottom)
                .frame(maxWidth:.infinity)
            }
            .background(Color.gray)
            .shadow(color: Color.black.opacity(0.2), radius: 7, x: 3, y: 3)
            .shadow(color: Color.white.opacity(0.7), radius: 4, x: -5, y: -5)
            VStack(alignment:.leading) {
                HStack {
                    Text(description)
                        .padding(.leading, 20)
                        .padding(.top, 30)
                        .foregroundColor(.gray)
                    Spacer()
                }
                Spacer()
            }
            .frame(maxWidth:.infinity,maxHeight:.infinity)
        }
        .edgesIgnoringSafeArea(.top)
    }
}
此代码:

.sheet(isPresented: self.$isEvent){
                                EventView(eventName: "\(event.name ?? "Unknown")", description:  "\(event.descript ?? "Unknown")", eventTime: (event.time ?? Date())).environment(\.managedObjectContext, self.managedObjectContext)
                            }
这是我假设问题所在的地方,但我发现它没有任何问题

事件视图

            List {
                    ForEach(self.Events) { event in
                        if("\(event.dotw ?? "Unknown")" == self.name) {
                            Button(action: {
                                self.isEvent.toggle()
                            }) {
                                HStack {
                                    Text("\(event.name ?? "Unknown")")
                                        .foregroundColor(Color.white)
                                    Spacer()
                                    Text("\(event.time ?? Date(), formatter: Self.taskDateFormat)")
                                }
                            }
                            .sheet(isPresented: self.$isEvent){
                                EventView(eventName: "\(event.name ?? "Unknown")", description:  "\(event.descript ?? "Unknown")", eventTime: (event.time ?? Date())).environment(\.managedObjectContext, self.managedObjectContext)
                            }
                            .buttonStyle(ItemButton())
                        }
                    }.onDelete { indexSet in
                        let deleteItem = self.Events[indexSet.first!]
                        self.managedObjectContext.delete(deleteItem)

                        do{
                            try self.managedObjectContext.save()
                        } catch {
                            print(error)
                        }
                    }
                    Button(action: {
                        self.isPresented.toggle()
                    }) {
                        HStack {
                            Text("new")
                            Spacer()
                        }
                    }
                    .buttonStyle(NewItemButton())
                    .sheet(isPresented:$isPresented) {
                        NewEventView(dotw: self.name).environment(\.managedObjectContext, self.managedObjectContext)
                }
            }
                .onAppear {
                    UITableView.appearance().separatorStyle = .none
                }.onDisappear {
                    UITableView.appearance().separatorStyle = .singleLine
                }
                .navigationBarHidden(true)
                .navigationBarTitle("")
                .edgesIgnoringSafeArea(.top)


        }
        .edgesIgnoringSafeArea(.top)
        .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .topLeading)
struct EventView: View {
    var eventName: String
    var description: String
    var eventTime: Date


    var body: some View {
        VStack {
            VStack {
                Image(systemName: "chevron.compact.down")
                        .foregroundColor(.white)
                        .imageScale(.large)
                    .padding()
                HStack {
                    Text(eventName)
                        .foregroundColor(.white)
                    .font(.largeTitle)
                    .padding(.top, 15)
                    .padding(.leading, 20)
                    Spacer()
                }

                .padding(.bottom)
                .frame(maxWidth:.infinity)
            }
            .background(Color.gray)
            .shadow(color: Color.black.opacity(0.2), radius: 7, x: 3, y: 3)
            .shadow(color: Color.white.opacity(0.7), radius: 4, x: -5, y: -5)
            VStack(alignment:.leading) {
                HStack {
                    Text(description)
                        .padding(.leading, 20)
                        .padding(.top, 30)
                        .foregroundColor(.gray)
                    Spacer()
                }
                Spacer()
            }
            .frame(maxWidth:.infinity,maxHeight:.infinity)
        }
        .edgesIgnoringSafeArea(.top)
    }
}
事件实体初始值设定项

import Foundation
import CoreData
import SwiftUI

public class Event:NSManagedObject,Identifiable {
    @NSManaged public var name: String?
    @NSManaged public var createdAt: Date?
    @NSManaged public var descript: String?
    @NSManaged public var dotw: String?
    @NSManaged public var time: Date?
}

extension Event {

    static func getAllEvents() -> NSFetchRequest<Event> {
        let request: NSFetchRequest<Event> = NSFetchRequest<Event>(entityName: "Event")
        let sortDescriptor = NSSortDescriptor(key: "time", ascending:true)
        let sortDescriptor2 = NSSortDescriptor(key: "createdAt", ascending: true)
        request.sortDescriptors = [sortDescriptor,sortDescriptor2]
        return request
    }
}
<代码>导入基础 导入CoreData 导入快捷键 公共类事件:NSManagedObject,可识别{ @NSManaged公共变量名称:字符串? @NSManaged public var createdAt:日期? @NSManaged公共变量描述符:字符串? @NSManaged public var dotw:字符串? @NSVAR管理的公共var时间:日期? } 扩展事件{ 静态函数getAllEvents()->NSFetchRequest{ let请求:NSFetchRequest=NSFetchRequest(entityName:“事件”) 让sortDescriptor=NSSortDescriptor(键:“时间”,升序:true) 让sortdescriptor 2=NSSortDescriptor(键:“createdAt”,升序:true) request.sortDescriptors=[sortDescriptor,sortDescriptor 2] 退货申请 } }
您的事件是否可识别?这有助于SwiftUI了解哪些是:

struct Events: Identifiable {
    var id = UUID()
    var name: String
}

也可能有助于将
.id(event.id)
放入您的ForEach块中,以便在其中识别它。

您的事件是否可识别?这有助于SwiftUI了解哪些是:

struct Events: Identifiable {
    var id = UUID()
    var name: String
}

也可能有助于将
.id(event.id)
放在您的ForEach块中,以便在那里识别它。

我在上面的代码中添加了我的事件数据实体类,它是可识别的,但我相信它是通过SortDescriptor的任何限制来识别的?在任何情况下,我都试图添加一个id,但我不确定如何在ForEach块中实现它。我在上面的代码中添加了我的事件数据实体类,它是可识别的,但我相信它是通过SortDescriptor的任何限制来识别的?在任何情况下,我都试图添加一个id,但我不确定如何在ForEach块中实现它。