ForEach not properly updating with dynamic content SwiftUI(ForEach未使用动态内容SwiftUI正确更新)
问题描述
很抱歉将这篇帖子写得这么长,但事后看来,我应该向您展示这个问题的更简单的实例,以便您可以更好地了解问题是什么。我假设ForEach的相同问题是这两个bug的根本原因,但我可能错了。仍然包含第二个实例,以便为您提供上下文,但第一个实例应该是您完全理解问题所需的全部内容。第一个实例:
这是这个问题的视频:https://imgur.com/a/EIg9TSm。如您所见,有4个时间代码,其中2个是最喜欢的,2个不是最喜欢的(用黄色星号表示)。此外,顶部有表示时间代码数组的文本,仅显示为收藏(F)或不收藏(N)列表。我点击Last Time Code(更改为收藏),然后按切换以取消收藏。当我点击保存时,时间代码数组被更新,但是正如您所看到的,列表中没有显示时间代码。但是,您会看到缩减数组的文本立即更新为FNFF,表明它已正确更新为ObservedObject的收藏夹。
当我单击导航并返回页面时,UI已正确更新,并且有3颗黄色星号。这让我假设问题出在ForEach上,因为文本()显示数组已更新,但ForEach没有。在页面外单击可能会重新加载ForEach,这就是它在退出页面后更新的原因。EditCodeView()处理CoreData中TimeCodeVieModel的保存,通过我自己的测试和ObservedObject按预期更新的事实,我99%确定它工作正常。我非常确定我使用的是ForEach的动态版本(因为TimeCodeViewModel是可识别的),所以我不知道如何在保存后立即更新行为。如有任何帮助,我们将不胜感激。
以下是视图的代码:
以下是视图模型的代码(不应该与问题相关,但包含在其中是为了理解):
第二个实例:
编辑:我意识到可能很难理解代码在做什么,所以我包含了一个演示问题的gif(不幸的是,我的声誉还不够高,无法让它自动显示)。如您所见,我选择了要更改的单元格,然后按下按钮将时间码分配给它。TimeCodeCellViewModels数组在后台发生变化,但在我按下主页按钮并重新打开应用程序(这会触发ForEach刷新)之前,您实际上看不到这种变化。Gif of issue。如果GIF太快,还有这个视频:https://imgur.com/a/Y5xtLJ3
我试图使用HStacks的VStack显示网格视图,但遇到了一个问题,当传入的数组更改时,我用来显示内容的ForEach没有刷新。我知道数组本身正在更改,因为如果我将其简化为字符串并使用text()显示内容,则一旦进行更改,它就会立即正确更新。但是,ForEach循环只有在我关闭并重新打开应用程序时才会更新,从而强制ForEach重新加载。我知道ForEach有一个专门为动态内容设计的特殊版本,但我非常确定我正在使用这个版本,因为我传入了""id:.self""。以下是主要代码片段:
我非常确定它不会改变任何事情,但是我必须为TimeCodeCellViewModel定义一个自定义散列函数,这可能会改变ForEach的行为(被改变的属性包含在散列函数中)。但是,我在使用不同视图模型的项目的另一部分中注意到了相同的ForEach行为,因此我非常怀疑这就是问题所在。
推荐答案
下面是代码正常工作所需的代码片段。
有关原因的一些基本信息,请参阅备注
这篇关于ForEach未使用动态内容SwiftUI正确更新的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!