SwiftUI PreviewProvider 를 사용하여 CoreData 를 표시하는 특정 항목 NSManagedObject

0

질문

[Xcode12.4Catalina10.15.6,MacOS 를 사용하여 프로젝트 SwiftUI 및 CoreData]

에서 일하고 있어요를 표시하는 응용 프로그램 일부 데이터가있다. 비즈니스 로직의 응용 프로그램,그리고 지금 나에 관심을 돌리게 되었 UI. 하기 위해 최대 깔끔한 UI,I 을 얻고 싶 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 entity(으로 몇 천 항목)을 가지고 각각의 여러 가지 특성을 포함하는 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. 내가를 수행하는 데 필요한든 사람들이 더쉽을 얻기 위해서는 데이터입니다.
  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ý
..................................................................................................................