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