Инициализировать основные данные SwiftUI - PullRequest
2 голосов
/ 08 мая 2020

Я пытаюсь инициировать данные, поэтому, когда пользователь впервые устанавливает приложение, у него есть некоторые данные. Инициализация не работает, но почему?

Для операций CRUD с базовыми данными я использую файл xcdatamodeld с сущностью ProgrammingLanguage, которая имеет два строковых атрибута: «имя» и «создатель» . Вот код:

struct ContentView: View {

@Environment(\.managedObjectContext) var managedObjectContext

@FetchRequest(
    entity: ProgrammingLanguage.entity(),
    sortDescriptors: [
        NSSortDescriptor(keyPath: \ProgrammingLanguage.name, ascending: true),
    ]
) var languages: FetchedResults<ProgrammingLanguage>

init() {

    let language = ProgrammingLanguage(context: self.managedObjectContext)
    language.name = "SwiftUI"
    language.creator = "Some text"

    do {
        try self.managedObjectContext.save()
    } catch {
    }

}

var body: some View {
    NavigationView {
        List {
            ForEach(languages, id: \.self) { language in
                Button(action: {
                }) {
                    Text("Creator: \(language.creator ?? "Anonymous")")
                }

            }
        }
    }
}
}

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

Ответы [ 2 ]

2 голосов
/ 08 мая 2020

нравится видеть SwiftUI, поэтому кажется, что вам нужно добавить запрос на выборку, он принесет вам массив искомого объекта coreData.

добавьте это свойство прямо под @Environment:

    @FetchRequest(entity: ProgrammingLanguage.entity(), sortDescriptors: []) var languages: FetchedResults<ProgrammingLanguage>

, тогда вы можете представить его как хотите

надеюсь, что это поможет, у Пола Хадсона есть отличный учебник по CoreData и SwiftUI, если вы хотите его посмотреть

https://www.hackingwithswift.com/100/swiftui/57

0 голосов
/ 05 сентября 2020

SwiftUI

Я бы рекомендовал сделать это с модификатором .onAppear(). В вашем примере кода это будет:

struct ContentView: View {
    
    @Environment(\.managedObjectContext) var managedObjectContext
    @FetchRequest(
        entity: ProgrammingLanguage.entity(),
        sortDescriptors: [
            NSSortDescriptor(keyPath: \ProgrammingLanguage.name, ascending: true),
        ]
    ) var languages: FetchedResults<ProgrammingLanguage>
    
    
    var body: some View {
        NavigationView {
            List {
                ForEach(languages, id: \.self) { language in
                    Button(action: {
                    }) {
                        Text("Creator: \(language.creator ?? "Anonymous")")
                    }
                    
                }
            }.onAppear() {
                let language = ProgrammingLanguage(context: self.managedObjectContext)
                language.name = "SwiftUI"
                language.creator = "Some text"
                do {
                    try self.managedObjectContext.save()
                } catch let error {
                    print(error)
                }
            }
        }
    }
}

Надеюсь, это поможет! Я нашел решение здесь: Форум разработчиков Apple

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...