如何解决用新数组替换数组不会触发列表视图重新加载
我有这些 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 举报,一经查实,本站将立刻删除。