SwiftUI PreviewProvider使用CoreData,以显示具体项十分整洁

0

的问题

[低12.4、卡塔利娜10.15.6,mac os项目使用SwiftUI和CoreData]

我工作上的一个应用程序,以显示一些数据我所拥有的。 商业逻辑的程序是工作的罚款,而现在我已经把我的注意。 为了收拾,我想得到的 PreviewProvider 工作的每个图。 我也喜欢的预览显示的数据,我已经在CoreData数据存储库。

经过多挫折,我终于得到的预览的汇编和显示器,但是我没有看到任何实际数据在预览。 它的出现,而NSManagedObjectContext是存在的,预览中没有选择任何输入到显示。

我怎么能选择,说第3条目的,在我的数据存储库,以显示在预览?

下面是我的代码的视,包括 PreviewProvider 在结束(作为正常的)的一些意见解释如下。

    
    
    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, namepath (到的文件)。 CoreDataStack.context 是一个参考的结构如下所示。

为了得到一个静态NSManagedObjectContext,如需要通过PreviewProvider,我已经加入以下结构到我的项目,因为每 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 成的预览。 我怎么可以这样做? (在此先感谢您的关注。)

core-data swiftui
2021-11-17 02:43:02
1

最好的答案

0

我的工作出了什么丢失我的 PreviewProvider 结构:

  1. 我需要执行一个NSFetchrequest以获得的数据。
  2. 然后,我能够访问的条目数据库使用的阵列的索引。
    注意,该指数是一个CoreData内部表示,如果你想要一个具体项目,使用 SQLite 浏览数据存储库,以找到一个你想要看到的。
struct EntriesView_Previews: PreviewProvider {

  @Environment(\.managedObjectContext) var managedObjectContext

  static var previews: some View {
    let context = CoreDataStack.context
    let domainFiles : [DomainFiles]
    let requestDomainFiles : NSFetchRequest<DomainFiles> = DomainFiles.fetchRequest()
    do {
      domainFiles = try context.fetch(requestDomainFiles)
    } catch {
      let nserror = error as NSError
      fatalError("Error \(nserror): \(nserror.userInfo)")   //  DO NOT DO THIS IN REAL CODE.  PROVIDE FALLBACK
    }
    let domain = domainFiles[0]
    return EntriesView(domain: domain)
      .environment(\.managedObjectContext, CoreDataStack.context)
  }
}
2021-11-17 05:01:43

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................