Belirli NSManagedObject Girdisini göstermek için CoreData kullanan SwiftUİ PreviewProvider

0

Soru

[Xcode 12.4, Catalina 10.15.6, SwiftUİ ve CoreData kullanan macOS Projesi]

Sahip olduğum bazı verileri görüntülemek için bir uygulama üzerinde çalışıyorum. Uygulamanın iş mantığı iyi çalışıyor ve şimdi dikkatimi kullanıcı arayüzüne çevirdim. Kullanıcı arayüzünü düzenli hale getirmek için aşağıdakileri almak istiyorum PreviewProvider her görünüm için çalışıyor. Önizlemelerin CoreData veri deposunda zaten sahip olduğum verileri görüntülemesini de istiyorum.

Çok fazla hayal kırıklığından sonra nihayet önizlemenin derlenmesini ve görüntülenmesini sağladım, ancak önizlemede herhangi bir gerçek veri göremiyorum. NSManagedObjectContext oradayken önizleme görüntülenecek herhangi bir girdi seçmemiş gibi görünüyor.

Önizlemede görüntülenecek veri deposumdaki 3. girdiyi nasıl seçebilirim?

Aşağıda, aşağıdakileri içeren görünüm için kodum var PreviewProvider sonunda (her zamanki gibi) bunu açıklayan bazı yorumlarla.

    
    
    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 her biri aşağıdakileri içeren çeşitli özniteliklere sahip bir CoreData varlığıdır (birkaç bin girişle) id, name, ve path (dosya için). CoreDataStack.context aşağıda gösterilen yapıya bir referanstır.

Previewprovider'ın gerektirdiği şekilde statik bir NSManagedObjectContext elde etmek için projeme aşağıdaki yapıyı ekledim 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() { ... }
    }

Örneğin, girişi şu şekilde iletmek isterim: domain.id == 3 önizlemenin içine. Bunu nasıl yapabilirim? (Teşekkürler ilerlemek için senin dikkat.)

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

En iyi cevabı

0

Bende neyin eksik olduğunu çözdüm. PreviewProvider struct:

  1. Verileri almak için bir NSFetchrequest gerçekleştirmem gerekiyordu.
  2. Ardından, dizi dizinini kullanarak veri deposundaki girdilere erişebildim.
    Dizinin bir CoreData iç gösterimi olduğunu ve belirli bir öğeyi istiyorsanız şunu kullanın: SQLite görmek istediğinizi bulmak için veri deposuna göz atmak için.
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

Diğer dillerde

Bu sayfa diğer dillerde

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