Swiftui 用新阵列替换阵列不会';t要重新加载的触发器列表视图

Swiftui 用新阵列替换阵列不会';t要重新加载的触发器列表视图,swiftui,swiftui-list,Swiftui,Swiftui List,我有这些轨迹对象,每个轨迹都有一个[版本]。轨迹是一个CoreData实体,与版本实体具有一对多关系 我有一个列表,其中有一个显示曲目标题的节标题,然后是与曲目关联的每个版本的行。可以删除这些版本。当前,当我删除一个版本时,列表不会得到更新。我想我的问题是我在这里错误地使用了@Published和@ObservedObject 每当我删除一个版本时,我都会重新加载列表的数据源,然而,我只是分配一个新数组,而不是修改旧数组,我相信这就是导致视图不更新的原因。有没有更好的办法 struct Trac

我有这些轨迹对象,每个轨迹都有一个[版本]。轨迹是一个CoreData实体,与版本实体具有一对多关系

我有一个列表,其中有一个显示曲目标题的节标题,然后是与曲目关联的每个版本的行。可以删除这些版本。当前,当我删除一个版本时,列表不会得到更新。我想我的问题是我在这里错误地使用了@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()
            }
        }
    }
} 

将需要最少的代码来测试,请添加曲目和版本类型以及。如果它们是结构,那么在子标题视图中,版本和曲目只是副本而不是引用。因此,无论我们对它们做什么,都不会影响audioData.trackItems。请尝试将
audioData
更改为@StateObject,而不是@ObservedObject。仅当对象已在视图外部创建并且正在将其引用传递给视图时,才使用ObservedObject。