Как / где назначить переменную сущности CoreData переменной структуры @State в SwiftUI?

Я использую переменные @State (название, описание) для связи с другим представлением (UITextView). Это представление имеет строковую переменную привязки (текст).

Я хочу использовать конкретный объект CoreData (Item) для обновления моих переменных @State, поэтому текст в UITextView обновляется при появлении представления (поэтому UITextView не отображается пустым). Насколько я понимаю, я должен каким-то образом назначить эту переменную сущности CoreData моей переменной @State, а когда я получаю обновления от UITextView для моих переменных @State, я должен сохранять контекст в своей сущности CoreData. Я использую init () для начального назначения и не получаю никаких ошибок, пока не перейду к отладке предварительного просмотра в реальном времени. Я получаю эту ошибку (как сообщение отладчика):

Не удалось вызвать назначенный инициализатор в классе NSManagedObject 'Item'

Кроме того, в превью отсутствует текст.

Может, есть другой способ делать то, что я хочу?

Вот мой код:

Основной вид

struct DetailView: View {
    @ObservedObject var item: Item = Item()
    @State private var title = ""
    @State private var description = ""
    init (item: Note)
    {
        self.item = item
        self.title = item.title!
...
 TextView(text: self.$title...
...
TextView(text: self.$details...
...

TextView

struct TextView: UIViewRepresentable {
    @Binding var text: String
...
func updateUIView(_ uiView: UITextView, context: Context) {
        uiView.text = text
...

P.S. когда я напрямую передаю (игнорируя существование моих переменных @State) в свойстве сущности CoreData (например, self.item.title) в качестве аргумента для отображения текста UITextView, действительно работает, но я не знаю, как сохранить изменения из UITextView в сущность CoreData напрямую


person Lorem Ipsum    schedule 08.08.2020    source источник
comment
Не вызывайте Item (), поскольку вы вводите экземпляр в свой метод инициализации.   -  person Joakim Danielson    schedule 08.08.2020


Ответы (1)


Есть несколько способов сделать это.

Есть способ @FetchedRequest, для которого существует множество учебных пособий.

https://www.hackingwithswift.com/quick-start/swiftui/what-is-the-fetchrequest-property-wrapper.

С помощью этого метода вы передадите объект users, который редактируете.

Также вы можете использовать FetchedResultsController.

https://www.youtube.com/watch?v=-U-4Zon6dbE < / а>

Таким образом вы можете получить @ObservableObject с объектами CoreData

https://developer.apple.com/documentation/coredata/nsfetchedresultscontroller

Объект ManagedObject или CoreData уже соответствует ObservableObject https://developer.apple.com/documentation/coredata/nsmanagedobject

Вам не нужно помещать его в @State, вам просто нужно передать полученный объект из CoreData.

Кроме того, когда пользователь закончит работу с объектом, вам нужно save managedObjectContext.

person lorem ipsum    schedule 09.08.2020
comment
Извините, могу ли я получить (используя @FetchRequest) тот же самый Item (), с которым я предоставляю наблюдаемую переменную элемента? - person Lorem Ipsum; 09.08.2020
comment
Мой код на самом деле выглядит примерно так: пользователь нажимает ItemView (который показывает переменные сущности CoreData (заголовок, описание) в качестве контекста) в ContentView. Я отправляю этот выбранный элемент обратно в ContentView (используя @State и @Binding). Затем я отправляю этот элемент как переменную (self.selectedItem) в DetailView. В моем DetailView это @ObservedObject item. Я думаю, что где-то скучаю по логике - person Lorem Ipsum; 09.08.2020
comment
Вам не нужны лишние State и Binding. Просто используйте объект CoreData. См. Учебное пособие по SwiftUI - Обработка пользовательского ввода. Просто замените UserData object в учебнике на CoreData Object, который вы хотите / имеете Fetched. В LandmarkList начните с вашего FetchedResult. - person lorem ipsum; 10.08.2020
comment
Кроме того, если вам нужен НОВЫЙ объект CoreData, который нельзя получить, вы должны его создать. Item(). См. Руководство по программированию CoreData в разделе «Создание и сохранение управляемых объектов». developer.apple.com/library/archive/documentation/Cocoa/ - person lorem ipsum; 10.08.2020