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 没有正确更新的主要内容,如果未能解决你的问题,请参考以下文章