List ForEach 没有正确更新

Posted

技术标签:

【中文标题】List ForEach 没有正确更新【英文标题】:List ForEach not updating correctly 【发布时间】:2021-04-23 08:26:42 【问题描述】:

我正在使用 Core data 和 Swiftui,一切正常,但在这个视图中,我有一个 List,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)
    
            

问题是我的 List ForEach,第一次按下添加按钮时显示新的原因,第二次按下按钮整个列表消失,第三次按下按钮列表再次显示所有 3 个项目.

为了测试问题,我添加了第一个 ForEach 部分并且始终显示正确的项目,因此视图模型或添加项目没有问题,添加项目并从视图模型发布部分已更新。

有没有人知道为什么我的 List ForEach 每隔一段时间才显示一次?

【问题讨论】:

没有Minimal Reproducible Example 无法帮助您解决问题。 根据我的经验,将 List 放入 VStack 中有时会导致奇怪的行为。您可以尝试一些事情: 1) 将 VStack 的框架设置为具有 .infinity 的 maxWidth 和 maxHeight,并将“scaleToFill()”修饰符放在列表中。 2) 将 .id(UUID()) 修饰符添加到您的列表,或者,如果这没有帮助,添加到您的 ForEach。如果您不需要像删除和重新排序这样的 List 行为,您也可以尝试使用 LazyVStack w/a pinned view for the Button。 【参考方案1】:

我遇到了这个问题。我通过在 ViewModel 中添加 objectWillChange 来解决这个问题,并在您的 why 更改时手动发送()它。其实我并不清楚你的NewLearningWhyViewModel,所以这只是一个例子,你应该尝试一下。

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

【讨论】:

【参考方案2】:

好的,Becky Hansmeyer 的帖子解决了它,将 .id(UUID()) 添加到列表中解决了它,它开始正常工作......

【讨论】:

【参考方案3】:

因为“viewModel.whys”是一组类。

SwiftUI 不能直接使用类。

有两种解决方案:

    使其成为结构而不是类 + 在视图内添加 @Published 修饰符 保持原样 + 做可观察对象,并在您的视图的初始化中分配给观察对象。

更多细节在这里:

https://***.com/a/62919526/4423545

【讨论】:

以上是关于List ForEach 没有正确更新的主要内容,如果未能解决你的问题,请参考以下文章

foreach与for的区别

HelloCube:ForEach

QTextEdit foreach

SwiftUI 将几何阅读器与 ForEach 结合使用

SwiftUI 列表未使用 ForEach 正确更新

将list转换为datatable的方法