[SwiftUI] CoreDataをSwiftUIと一緒に使っていて、Previewを表示させるまでのステップ

CoreDataを使っていると、SwiftUIのプレビューをきちんと表示させるまでにいくつかステップが必要です。そのためのメモ

まずは、NSManagedObjectContext

大抵、@FetchRequestを使っていると思いますが、@FetchRequestは、environmentにNSManagedObjectContextが設定されていることを期待しています。
Previewでも同じなので、セットする必要があります。

struct RecordListView_Previews: PreviewProvider {
    static let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

    static var previews: some View {
        return RecordListView().environment(\.managedObjectContext, context)
    }
}

Previewにおためしの要素が欲しいですよね

CoreDataからデータを取得してそれを表示するためのビューで、表示対象の要素がなければ、Previewも空っぽです。
配置の具合を見たいので、何か要素が必要ですよね。

MEMO
  • 以下のサンプルコードで使っているRecordは、CoreDataでEntityとして定義されたものです。

以下のようなextentionを作って、サンプルを作れるようにします。

extension Record {
    static func oneRecord(moc:NSManagedObjectContext) -> Record {
        let record = Record(context: moc)
        record.prop = ?? // 適宜、プロパティをセット
        ...
        
        return record
    }
}    

それを使って、Previewの中でCoreDataに要素を作成します。

    static var previews: some View {
        let _ = Record.oneRecord(moc: RecordListView_Previews.context)
        return RecordListView().environment(\.managedObjectContext,
                                            RecordListView_Previews.context)
    }

これで、要素が設定されているCoreDataを対象として、Previewが表示されることになります。

問題点

CoreDataは、データを永続化するものなので、Previewすると要素が増えていきます・・・
気になる人は、CoreDataでのconstraintで何かのプロパティを制約条件にすると、Previewを動作させると制約が有効になり、要素が減ります。
# ただ、Previewを動作させないと、要素は減りません・・・Previewだとどの段階でCoreDataは動作してるんでしょうね?

もしくは、要素をクリアするメソッドをどこかにつくって、動かすのも良いかもしれません。まぁ、Previewで配置を見たいだけなので、だれも気にしないですかね。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です