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