微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用新数组替换数组不会触发列表视图重新加载

如何解决用新数组替换数组不会触发列表视图重新加载

我有这些 Track 对象,每个 Track 都有一个 [版本]。 Tracks 是一个 CoreData 实体,与 Version 实体是一对多的关系。

我有一个列表,它有一个显示曲目标题的部分标题,然后是与曲目关联的每个版本的一行。这些版本可以删除。目前,当我删除一个版本时,列表没有更新。我认为我的问题是我在这里错误地使用了 @Published 和 @Observedobject。

每当我删除一个版本时,我都会重新加载列表的数据源,但是,我只是分配一个新数组而不是修改旧数组,我相信这是导致视图不更新的原因。有没有更好的方法解决这个问题?

struct TrackItem: Identifiable {
    var id = UUID()
    var track: Track
    var versions: [Version]
    var expanded = false
}


class AudioData : ObservableObject {

    @Published var trackItems : [TrackItem]?

    init() {
        self.trackItems = loadTrackItems()
    }
    
    func loadTrackItems() -> [TrackItem] {
        let tracks: [Track] = DataManager.getTracks()
        var trackItems: [TrackItem] = []
        for track in tracks {
            let trackItem = TrackItem(track: track,versions: track.versions?.allObjects as! [Version])
            trackItems.append(trackItem)
        }
        return trackItems
    }
    
    func refresh() {
        self.trackItems = loadTrackItems()
    }
}

struct SubHeaderView: View {

    var version : Version
    var track: Track
    @Binding var itemDeleted: Bool

    // some code that displays Version information
    // Also a button to delete Version from [Version] of Track
    // track.removeFromVersions(version)
    // Need to update List view after version is deleted
}

struct SecondView: View {
    
    @Observedobject var audioData = AudioData()
    
    @State var itemDeleted: Bool = false
    
    var body: some View {
        ZStack {
             List {
                    ForEach(self.audioData.trackItems!) { trackItem in
                        Section(header: HeaderView(trackItem: trackItem),footer: EmptyView()) {
                            ForEach(trackItem.versions) { version in
                                SubHeaderView(version: version,track: trackItem.track,itemDeleted: $itemDeleted)
                            } 
                        }
                    }
                }
        }.onChange(of: self.itemDeleted) { _ in
            if(self.itemDeleted) {
                // when version is deleted,reload data
                audioData.refresh()
            }
        }
    }
} 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。