#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
}
}
}