Swiftui 列表未正确更新

Swiftui 列表未正确更新,swiftui,swiftui-list,Swiftui,Swiftui List,我使用的是核心数据和Swiftui,一切都很好,但在这个视图中,我有一个列表,ForEach不起作用 因此,出于测试目的,我的代码目前如下所示: @ObservedObject var viewModel = NewLearningWhyViewModel() VStack { ForEach(viewModel.whys, id: \.self) { why in Text(why.why) } List {

我使用的是核心数据和Swiftui,一切都很好,但在这个视图中,我有一个列表,ForEach不起作用

因此,出于测试目的,我的代码目前如下所示:


@ObservedObject var viewModel = NewLearningWhyViewModel()

VStack {
    ForEach(viewModel.whys, id: \.self) { why in
        Text(why.why)
    }
            
    List {
        ForEach(viewModel.whys, id: \.self) { why in
            Text(why.why)
        }
    }
           
    Button(action: {
        viewModel.createWhy(why: "Test", count: viewModel.whys.count, learning: learn)
        viewModel.fetchWhy(predicate: NSPredicate(format: "parentLearning == %@", learn))
    }){
        Text("Add")
            .font(.title)
            .foregroundColor(.white)
    }
}            
问题是我的列表{ForEach,我第一次按add按钮时,它显示了新的原因,第二次按按钮时,整个列表消失,第三次按按钮时,列表再次显示所有3项

为了测试这个问题,我添加了第一个ForEach部分,它始终显示正确的项,因此viewmodel或添加项没有问题,添加项并从viewmodel发布,因为该部分已更新


有人知道为什么我的列表{ForEach只每隔一次显示一次吗?

我遇到了这个问题。我通过在ViewModel中添加
objectWillChange
和send()来解决这个问题当你的
为什么
被更改时,它会手动执行。实际上我不清楚你的
新学习为什么视图模型
,所以这只是一个示例,你应该尝试一下

class NewLearningWhyViewModel: ObservableObject {
    let objectWillChange: ObservableObjectPublisher = ObservableObjectPublisher()
    @Published var whys: Why = Why() {
        didSet {
            objectWillChange.send()
        }
    }
}

好的,Becky Hansmeyer的帖子解决了这个问题,添加了.id(UUID())根据我的经验,将列表放在VStack中有时会导致奇怪的行为。您可以尝试以下几点:1)将VStack的框架设置为maxWidth和maxHeight为.infinity,并放置“scaleToFill()”在列表中添加.id(UUID())修饰符。2)将.id修饰符添加到列表中,如果没有帮助,则添加到ForEach中。如果不需要删除和重新排序等列表行为,也可以尝试为按钮添加带有固定视图的LazyVStack。