子视图更改SwiftUI后更新视图

Posted

技术标签:

【中文标题】子视图更改SwiftUI后更新视图【英文标题】:Update view after subview change SwiftUI 【发布时间】:2021-03-27 14:51:22 【问题描述】:

我有一个 Show CoreData NSManagedObject 和多个 Seasons。两种型号都可以标记为watched。当Show 的所有季节都标记为已观看时,Show 也应标记为已观看。我如何实现这一目标?我尝试为我的 NSManagedObject 类使用手动 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)
            
        
    

列表项的类:

// SeasonListItemView.swift

@ObservedObject var season: Season

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

我的意思是这完全有道理,因为Show 模型不知道应该在观看所有季节时将其标记为已观看,但是我如何实现并让它自动更新并同时使用CoreData

// 编辑: 添加了我的最后一次编辑作为答案,因为没有找到其他解决方案。

【问题讨论】:

我希望有人能回答这个问题,因为我正在处理类似的问题。我认为设置观察者可能会奏效,但我从未设置过,所以我不确定。 @Ethan 也许我所做的编辑对您有所帮助。至少这对我来说解决了它,但它仍然感觉有点麻烦。 【参考方案1】:

到目前为止,我已经设法在 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
        
    

【讨论】:

以上是关于子视图更改SwiftUI后更新视图的主要内容,如果未能解决你的问题,请参考以下文章

Core Data 更改时更新 Swiftui 视图

在 SwiftUI 中更改完成视图

@ObservedObject 更改后 SwiftUI 视图未更新

SwiftUI ObservedObject 不更新父视图

在 SwiftUI MVVM 中的子视图和父视图之间共享值

SwiftUI @Binding 未在子项中更新