Как перезагрузить строку SwiftUI Core Data-backed list, если изменяются свойства объекта? - PullRequest
1 голос
/ 16 января 2020

У меня есть стандартная настройка списка SwiftUI, поддерживаемая Core Data FetchRequest.

struct SomeView: View {

    var container: Container
    var myObjects: FetchRequest<MyObject>

    init(container: Container) {
        let predicate : NSPredicate = NSPredicate(format: "container = %@", container)
        self.container = container
        self.myObjects = FetchRequest<MyObject>(entity: MyObject.entity(), sortDescriptors: [NSSortDescriptor(key: "date", ascending: true)], predicate: predicate)
    }

    var body: some View {
        VStack(spacing: 0.0) {
            List(myObjects.wrappedValue, id: \.uniqueIdentifier) { myObject in
                rowView(for: myObject, from: self.myObjects.wrappedValue)
            }
        }
    }
}

Все хорошо работает, когда элементы добавляются и удаляются. RowView возвращает представление, представляющее различное содержимое на основе различных свойств myObject.

Проблема: когда я изменяю определенный myObject в другом месте приложения (изменяю одно из его свойств) и сохраняю связанный Core Data ManagedObjectContext, Строка списка, представляющая этот элемент, не обновляется / обновляется в пользовательском интерфейсе.

Возможно, причиной этого является то, что я обновляю свой объект Core Data, устанавливая свойство, которое, в свою очередь, устанавливает другое свойство. Возможно связанная с этим сигнализация не достигает нужного места, и мне следует отправлять больше уведомлений здесь.

Код в MyObject. ObjectType - это перечисление, typeValue поддерживает это int32, которое фактически сохраняется в базе данных CD.

var type: ObjectType {
    get {
        return ObjectType(rawValue: typeValue)!
    }
    set {
        self.typeValue = newValue.rawValue
    }
}

Как заставить строку списка обновляться, когда резервный объект базовых данных изменяется и сохраняется в другом месте в приложение?

1 Ответ

0 голосов
/ 01 февраля 2020

Я наконец понял это самостоятельно. Исправления не было в списке, но дальше по стеку, в RowView.

Код RowView был таким:

struct RowView: View {
    var myObject: MyObject
    // Other code to render body etc
}

При этом RowView работает, как и ожидалось, но обрабатывает myObject как неизменный. Любые изменения в myObject не вызывают перерисовку представления.

Исправление с одним ключевым словом заключается в добавлении @ObservedObject к объявлению:

struct RowView: View {
    @ObservedObject var myObject: MyObject
}

Теперь оно работает, как и ожидалось, и любые обновления MyObject вызвать перерисовку.

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