Как показать образец данных в PreviewProvider при использовании FetchRequest - PullRequest
6 голосов
/ 03 августа 2020

У меня есть SwiftUI View, например:

import SwiftUI

struct ReView: View {
    @Environment(\.managedObjectContext) var moc
    @FetchRequest(
        entity: Re.entity(),
        sortDescriptors: [
            NSSortDescriptor(keyPath: \Re.name, ascending: false)
        ]
    ) var entities: FetchedResults<Re>
    
    var body: some View {
        NavigationView {
            List(entities, id: \.self) { entity in
                Text(entity.name ?? "Unknown")
            }
        }
    }
}

struct ReView_Previews: PreviewProvider {
    static var previews: some View {
            Group {
               
                ReView()
                    .environment(\.managedObjectContext, PersistentCloudKitContainer.persistentContainer.viewContext)
            }
        }
}

Что я могу сделать, чтобы показать некоторые образцы данных в моем предварительном просмотре?

Ответы [ 2 ]

3 голосов
/ 13 августа 2020

Вот адаптированный подход (ранее предложенный в { ссылка }), протестированный с помощью Xcode 12 / iOS 14

Идея состоит в том, чтобы отделить явное представление + модель от поставщика модели ( в данном случае облачная база данных), поэтому представление может быть разработано и протестировано (предварительно просмотрено) с использованием локальной или динамически созданной макетной модели (не связанной с тяжелым облачным подключением)

truct ReView: View {
    @Environment(\.managedObjectContext) var moc
    @FetchRequest(
        entity: Re.entity(),
        sortDescriptors: [
            NSSortDescriptor(keyPath: \Re.name, ascending: false)
        ]
    ) var entities: FetchedResults<Re>
    
    var body: some View {
        ReEntitiesView(entities: entities)
    }
}

struct ReEntitiesView<Results:RandomAccessCollection>: View where Results.Element == Re {
    let entities: Results

    var body: some View {
        NavigationView {
            List(entities, id: \.self) { entity in
                Text(entity.name ?? "Unknown")
            }
        }
    }
}

struct ReView_Previews: PreviewProvider {
    static let entity = NSManagedObjectModel.mergedModel(from: nil)?.entitiesByName["Re"]

    static var previews: some View {
       let object = Re(entity: entity!, insertInto: nil)
       object.name = "Test Name"

       return ReEntitiesView(entities: [object])
   }
}
0 голосов
/ 12 августа 2020

Мне удалось создать stati c mo c для структуры предварительного просмотра и затем добавить к нему данные по мере необходимости.

Примерно так:

struct ReView_Previews: PreviewProvider {
    static let moc = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
    _ = Re(context: moc, mandatoryParam1: "foo" ...)
    _ = Re(context: moc, mandatoryParam1: "bah" ...)
    
    static var previews: some View {
        Group {
            ReView()
                .environment(\.managedObjectContext, moc)
        }
    }
}

Я все еще только начинаю использовать SwiftUI, поэтому почти наверняка есть более элегантные способы достижения. Но, по сути, создание тестовых данных - это просто программирование последовательности, которая будет происходить в симуляторе для их создания, поскольку в режиме реального времени это и есть предварительный просмотр.

Обратной стороной является то, что очистка поврежденных тестовых данных также может занять некоторые усилия по программированию.

Удачи.

...