SwiftUI PreviewProvider ใช้ CoreData เพื่อให้แสดงเฉพาะ NSManagedObject รายการ

0

คำถาม

[Xcode 12.4,Catalina 10.15.6,MacOS โครงการใช้ SwiftUI และ CoreData]

ฉันทำงานเป็นแอพที่จะแสดงข้อมูลบางอย่างที่ฉันมีแล้ว ธุรกิจตรรกะของแอพทำงานดีและตอนนี้ฉันเปลี่ยนของความสนใจส่วนติดต่อผู้ใช้ขอ. เพื่อช่วยเก็บข้าวของให้คนส่วนติดต่อผู้ใช้ขอฉันอยากได้ PreviewProvider ทำงานสำหรับแต่ละมุมมอง ฉันจะยังเหมือนการแสดงตัวอย่างเพื่อให้แสดงข้อมูลของฉันแล้วต้องอยู่ใน CoreData datastore.

หลังจากความผมในที่สุดก็ต้องการจะแสดงตัวอย่างต้อง compile และแสดงอย่างไรก็ตามฉันไม่เห็นแท้จริงข้อมูลในส่วนแสดงตัวอย่าง. ดูเหมือนว่าระหว่างที่ค NSManagedObjectContext คือมีพื้นที่แสดงภาพตัวอย่างไม่มีที่เลือกมีรายการที่แสดงผล

จะให้ฉันเลือกที่ 3 อยู่ในรายการของฉัน datastore จะถูกแสดงในตัวอย่าง?

ด้านล่างของฉันคือรหัสสำหรับมุมมอนั่นรวมถึงการค 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, nameแล้ว path (ต้องแฟ้ม). CoreDataStack.context คือการอ้างอิงไปที่ struct แสดงทางด้านล่างนี้

เพื่อให้ได้เป็นในรูปของไฟฟ้าสถิตย์ NSManagedObjectContext อย่างที่ต้องการ PreviewProvider ฉันต้องการเพิ่มคลังตาม struct ของโครงการเป็นส่วนหนึ่ง 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 struct:

  1. ฉันต้องการที่จะแสดงเป็น NSFetchrequest เพื่อให้ได้ข้อมูลออกมา
  2. งั้น,ฉันสามารถเข้าถึงรายการใน datastore ใช้ตารางคู่ลำดับดัชนี
    โปรดจำไว้ว่าระดัชนีคือ CoreData ภายในตัวแทนแล้วและถ้าคุณต้องการให้เป็นเฉพาะรายการใช้ SQLite เพื่อเรียกดูที่ datastore ต้องหาคนที่คุณต้องการจะเห็น
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ý
..................................................................................................................