子视图更改 SwiftUI 后更新视图

时间:2021-03-27 14:51:22

标签: swift swiftui combine

我有一个 Show CoreData NSManagedObject 和多个 Seasons。两种模型都可以标记为 watched。当 Show 的所有季节都标记为已观看时,Show 也应标记为已观看。我如何实现这一目标?我尝试为 NSManagedObject 类使用手动 getter 和 setter,但无法在状态更改时更新视图。

图形用户界面: enter image description here

我的主视图代码:

// 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 个答案:

答案 0 :(得分:0)

到目前为止,我已经设法在 Season 模型上使用自己的 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
        }
    }
}