【发布时间】:2019-11-27 00:17:03
【问题描述】:
我是 SwiftUI 的新手,部分是 Swift,所以希望有人能对我公然遗漏的东西有所了解。原谅乱码!我还没有机会重构。
我正在使用@FetchRequest 属性包装器从CoreData 模型中提取所有Memories 的列表,其中定义了NSFetchRequest<Memory> 方法,从NSManagedObject 扩展。
当我通过 ForEach 在 SwiftUI 中迭代 FetchRequest<Memory> 的结果时,它会将 NSManagedObject 的实例返回到循环变量中,而不是 Memory,因此显示错误:Value of type 'NSManagedObject' has no member 'createdAt'对于以下 SwiftUI 类:
import SwiftUI
struct MemoryView: View {
@Environment(
\.managedObjectContext
) var managedObjectContext
@FetchRequest(
fetchRequest: Memory.allMemories()
) var allMemories: FetchedResults<Memory>
@State private var newMemory = ""
var body: some View {
NavigationView {
List {
Section(header: Text("What's on your mind?")) {
HStack {
TextField("New memory", text: self.$newMemory)
Button(action: {
let memory = Memory(context: self.managedObjectContext)
memory.title = self.newMemory
memory.createdAt = Date()
do {
try self.managedObjectContext.save()
} catch {
print(error)
}
self.newMemory = ""
}) {
Image(systemName: "plus.circle.fill")
.foregroundColor(.green)
.imageScale(.large)
}
}
}
.font(.headline)
Section(header: Text("My Memories")) {
ForEach(self.allMemories) { memoryItem in
MemoryRow(title: memoryItem.title, createdAt: memoryItem.createdAt)
// /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\
// >>> Error:
// >>> Value of type 'NSManagedObject' has no member 'createdAt'
}
}
}
.navigationBarTitle(Text("Memories"))
.navigationBarItems(trailing: EditButton())
}
}
}
struct MemoryView_Previews: PreviewProvider {
static var previews: some View {
MemoryView()
}
}
作为参考,有问题的Memory模型如下:
import Foundation
import CoreData
import CoreLocation
// Define the CoreData Object Model.
// Ensuring that this class name matches
// the entity model name.
public class Memory: NSManagedObject, Identifiable {
@NSManaged public var title: String?
@NSManaged public var body: String?
@NSManaged public var latitude: Double
@NSManaged public var longitude: Double
@NSManaged public var createdAt: Date?
@NSManaged public var updatedAt: Date?
// @NSManaged public var type: Type?
// @NSManaged public var tags: [Tags]?
}
// Create an extension in which to place things out of the context
// of the initial class declaration within.
extension Memory {
// Define a helper method for accessing a generated
// CLLocationCoordinate2D instance from the objects
// latitude and longitude values.
var locationCoordinate: CLLocationCoordinate2D {
CLLocationCoordinate2D(
latitude: latitude,
longitude: longitude
)
}
// Define a helper method that grabs all instances of a Memory
// sorted by their created date in ascending order.
static func allMemories() -> NSFetchRequest<Memory> {
let request: NSFetchRequest<Memory> = Memory.fetchRequest() as! NSFetchRequest<Memory>
let sortDescriptor = NSSortDescriptor(key: "createdAt", ascending: true)
request.sortDescriptors = [sortDescriptor]
return request
}
}
任何对此的帮助将不胜感激,因为我完全没有想法。我认为明天的问题的新思路!
编辑:这是MemoryRow 类:
import SwiftUI
struct MemoryRow: View {
var title: String = ""
var createdAt: String = ""
var body: some View {
HStack {
VStack(alignment: .leading) {
Text(title)
.font(.headline)
Text(createdAt)
.font(.caption)
}
}
}
}
struct MemoryRow_Previews: PreviewProvider {
static var previews: some View {
MemoryRow(title: "Test Title", createdAt: "Test Date")
}
}
【问题讨论】:
-
MemoryRow是什么? -
另外,您是否检查过
memoryItem是Memory对象,而不是NSManagedObject? -
它是另一个 SwiftUI 类,我将其拆分为一个组件来呈现行。我已经编辑了我的答案!
-
我将如何检查或强制对象类型? Xcode 报告
memoryItem在与它交互时是NSManagedObject的一个实例。