Обновить представление после изменения вложенного представления SwiftUI

#swift #swiftui #combine

#swift #swiftui #объединить

Вопрос:

У меня есть Show CoreData NSManagedObject с несколькими Seasons . Обе модели могут быть помечены как watched . Когда все сезоны a Show отмечены как просмотренные Show , они также должны быть отмечены как просмотренные. Как мне этого добиться? Я пытался использовать ручной метод получения и настройки для своих NSManagedObject классов, но я не могу обновить свое представление при изменении состояния.

Графический интерфейс: введите описание изображения здесь

Мой код основного представления:

 // ShowDetailView.swift

@ObservedObject var show: Show

// ... in the body

Button(action: {
    show.isWatched.toggle()
}, label: {
    HStack {
        Image(systemName: show.isWatched ? "checkmark.rectangle.fill" : "checkmark.rectangle")
    }
})

ScrollView(.horizontal) {
    LazyHStack {
        ForEach(seasons) { season in
            NavigationLink(destination: SeasonDetailView(season: season)) {
                SeasonListItemView(season: season)
                    .environment(.managedObjectContext, viewContext)
            }
        }
    }
}
 

Класс для элемента списка:

 // SeasonListItemView.swift

@ObservedObject var season: Season

Button(action: {
    season.isWatched.toggle()
}, label: {
    HStack {
        Image(systemName: season.isWatched ? "checkmark.rectangle.fill" : "checkmark.rectangle")
    }
})
 

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

// Редактировать: добавлено мое последнее редактирование в качестве ответа, потому что другого решения найдено не было.

Комментарии:

1. Я надеялся, что кто-нибудь ответит на это, поскольку я имею дело с аналогичной проблемой. Я думаю, что, возможно, настройка наблюдателя может сработать, но я никогда его не настраивал, поэтому я не уверен.

2. @Ethan может быть, редактирование, которое я сделал, поможет вам. По крайней мере, это исправляет это для меня, но все равно кажется немного громоздким.

Ответ №1:

До сих пор мне удалось исправить это с помощью собственного метода настройки в модели Season, который проверяет все сезоны на своем собственном шоу, а затем соответствующим образом устанавливает флаг, но он не кажется действительно «реактивным»:

// Настройка вручную для модели сезона

 func setIsWatched(_ isWatched: Bool) {
    self.isWatched = isWatched

    if let seasons = show?.seasons?.array as? [Season] {
        for season in seasons {
            if !season.isWatched {
                show?.isWatched = false
                return
            }

            show?.isWatched = true
        }
    }
}