【发布时间】:2021-12-28 01:44:30
【问题描述】:
[Xcode 12.4、Catalina 10.15.6、使用 SwiftUI 和 CoreData 的 MacOS 项目]
我正在开发一个应用程序来显示我拥有的一些数据。该应用程序的业务逻辑运行良好,现在我将注意力转向了 UI。
为了整理 UI,我想让 PreviewProvider 为每个视图工作。我还希望预览显示我在 CoreData 数据存储中已有的数据。
经过一番挫折,我终于设法编译和显示预览,但是我在预览中没有看到任何实际数据。看起来,虽然 NSManagedObjectContext 在那里,但预览没有选择任何要显示的条目。
我如何选择数据存储中的第三个条目以显示在预览中?
下面是我的视图代码,其中包含末尾的PreviewProvider(正常情况下),下面是一些 cmets 解释它。
import SwiftUI
struct DomainRow: View {
@Environment(\.managedObjectContext) var context
@ObservedObject var domain : DomainFiles
private var id : LocalizedStringKey {
get {
return LocalizedStringKey(String(Int(domain.id)))
}
}
var body: some View {
HStack (alignment: .center) {
Text(id)
Spacer()
VStack(alignment: .leading) {
Text(domain.name!)
.fontWeight(.bold)
.truncationMode(.tail)
.frame(minWidth: 20)
Text(domain.path!)
.font(.caption)
.opacity(0.625)
.truncationMode(.middle)
}
}
.padding(.vertical, 4)
}
}
#if DEBUG
struct DomainRow_Previews: PreviewProvider {
@Environment(\.managedObjectContext) var managedObjectContext
static var previews: some View {
let context = CoreDataStack.context
let domain = DomainFiles(context: context)
return DomainRow(domain: domain)
.environment(\.managedObjectContext, CoreDataStack.context)
}
}
#endif
DomainFiles 是一个 CoreData 实体(有几千个条目),每个实体都有几个属性,包括 id、name 和 path(到文件)。 CoreDataStack.context 是对如下所示结构的引用。
为了根据 PreviewProvider 的要求获得静态 NSManagedObjectContext,我已将以下结构添加到我的项目中,根据 https://developer.apple.com/forums/thread/650269
import Foundation
import CoreData
struct CoreDataStack {
static var context: NSManagedObjectContext {
return persistentContainer.viewContext
}
static let containerName: String = "MyAppsDataStore"
static var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: containerName)
container.loadPersistentStores { (description, error) in
if let error = error {
print(error)
}
}
return container
}()
// Don't need to save anything in the preview.
// func saveContext() { ... }
}
例如,我想将带有domain.id == 3 的条目传递到预览中。
我怎样才能做到这一点?
(提前感谢您的关注。)
【问题讨论】: