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で配置を見たいだけなので、だれも気にしないですかね。
Sponsor Link