子视图更改 SwiftUI 后更新视图
Update view after subview change SwiftUI
我有一个 Show
CoreData
NSManagedObject
和多个 Seasons
。两种模型都可以标记为watched
。当 Show
的所有季节都标记为已观看时,Show
也应标记为已观看。我如何实现这一目标?我尝试为我的 NSManagedObject
class 使用手动 getter 和 setter,但是当状态改变时我无法更新我的视图。
图形用户界面:
我的主视图代码:
// 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)
}
}
}
}
列表项的class:
// SeasonListItemView.swift
@ObservedObject var season: Season
Button(action: {
season.isWatched.toggle()
}, label: {
HStack {
Image(systemName: season.isWatched ? "checkmark.rectangle.fill" : "checkmark.rectangle")
}
})
我的意思是它完全有道理,因为 Show
模型不知道当所有季节都被观看时它应该被标记为已观看,但是我如何实现并让它自动更新并使用 CoreData
同时?
// 编辑:
添加我最后的编辑作为答案,因为没有找到其他解决方案。
到目前为止,我已经设法在 Season 模型上使用自己的 setter 方法修复了它,该方法检查自己节目中的所有季节,然后相应地设置标志,但感觉并不是真正的“反应性” ":
// 在季节模型上手动 setter
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
}
}
}
我有一个 Show
CoreData
NSManagedObject
和多个 Seasons
。两种模型都可以标记为watched
。当 Show
的所有季节都标记为已观看时,Show
也应标记为已观看。我如何实现这一目标?我尝试为我的 NSManagedObject
class 使用手动 getter 和 setter,但是当状态改变时我无法更新我的视图。
图形用户界面:
我的主视图代码:
// 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)
}
}
}
}
列表项的class:
// SeasonListItemView.swift
@ObservedObject var season: Season
Button(action: {
season.isWatched.toggle()
}, label: {
HStack {
Image(systemName: season.isWatched ? "checkmark.rectangle.fill" : "checkmark.rectangle")
}
})
我的意思是它完全有道理,因为 Show
模型不知道当所有季节都被观看时它应该被标记为已观看,但是我如何实现并让它自动更新并使用 CoreData
同时?
// 编辑: 添加我最后的编辑作为答案,因为没有找到其他解决方案。
到目前为止,我已经设法在 Season 模型上使用自己的 setter 方法修复了它,该方法检查自己节目中的所有季节,然后相应地设置标志,但感觉并不是真正的“反应性” ":
// 在季节模型上手动 setter
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
}
}
}