[Xcode 12.4, Catalina 10.15.6, projekt macOS z wykorzystaniem SwiftUI i CoreData]
Pracuję nad aplikacją do wyświetlania niektórych dostępnych u mnie danych. Logika biznesowa aplikacji działa normalnie, a teraz zwróciłem uwagę na interfejs użytkownika.
Do tego, aby doprowadzić do porządku interfejs użytkownika, chciałbym uzyskać PreviewProvider
działa dla każdego gatunku. Chciałbym również, aby wstępne przeglądy zawierały dane, które już mam w repozytorium danych CoreData.
Po wielu rozczarowań mi w końcu udało się skompilować i wyświetlić podgląd, jednak nie widzę żadnych rzeczywistych danych w podglądzie. Wygląda na to, że choć NSManagedObjectContext obecny, podgląd nie wybrał żadnych wpisów do wyświetlenia.
Jak mogę wybrać, powiedzmy, 3. wpis w moim repozytorium danych, która będzie wyświetlana w podglądzie?
Oto mój kod do prezentacji, która zawiera PreviewProvider
w końcu (jak zwykle) z niektórymi komentarzami, объясняющими to poniżej.
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
jest istotą CoreData (z kilku tysięcy rekordów), z których każda ma kilka cech, które obejmują id
, name
i path
(w pliku). CoreDataStack.context
to jest link na strukturę pokazaną poniżej.
Aby uzyskać statyczny NSManagedObjectContext, jak wymaga tego dostawca podglądu, dodałem swój projekt następującą strukturę zgodnie z 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() { ... }
}
Ja bym na przykład chciał przekazać nagranie z domain.id == 3
w podglądzie.
Jak mogę to zrobić?
(Z góry dziękuję za uwagę.)