如何让SwiftUI侧边栏菜单每次都显示相同的DetailView,而不是创建一个新的(在macOS上)

如何让SwiftUI侧边栏菜单每次都显示相同的DetailView,而不是创建一个新的(在macOS上),swiftui,Swiftui,我有一个macOS Master/Detail应用程序,它使用NavigationView,左侧面板中有一个侧栏菜单,右侧面板中有一系列详细视图 当用户选择不同的侧栏菜单选项时,我希望保留详细视图,这样,如果用户通过选择以前的选择菜单选项切换回来,则应用程序应显示带有任何用户更改或选择的原始创建的详细视图 目前,当选择菜单选项时,SwiftUI似乎从头开始创建一个新视图,而不仅仅是显示先前创建的视图。例如,如果“详细信息”视图有一个ListView,并且用户以前选择了一个项目,则此选择将丢失,就

我有一个macOS Master/Detail应用程序,它使用NavigationView,左侧面板中有一个侧栏菜单,右侧面板中有一系列详细视图

当用户选择不同的侧栏菜单选项时,我希望保留详细视图,这样,如果用户通过选择以前的选择菜单选项切换回来,则应用程序应显示带有任何用户更改或选择的原始创建的详细视图

目前,当选择菜单选项时,SwiftUI似乎从头开始创建一个新视图,而不仅仅是显示先前创建的视图。例如,如果“详细信息”视图有一个ListView,并且用户以前选择了一个项目,则此选择将丢失,就像以前的任何滚动位置一样


使用SwiftUI是否可以实现这一点。

目前SwiftUI似乎不支持这一点。以下是一些类似的问题:


SwiftUI从模型(例如绑定)创建视图。存储选择和滚动位置,以便可以完全按照原样重新创建视图。由于视图可能会更新为不同的大小,因此最好存储顶部可见的项目ID并滚动到该ID,而不是偏移量


旧的UITabBarController使其子视图控制器保持活动状态的方式可能会被视为一个错误和内存浪费。

SwiftUI目前不支持滚动位置持久性,但其他所有内容(如选择、用户更改)都应按概念存储在模型中,当它再次出现时,将由视图呈现。所以,你需要重新考虑应用程序的设计。你不能保留视图,它只是struct,value。嗯,这就是我所怀疑的,所以使用“@State”实际上是无用的,因为如果丢失了,你需要使用“@EnvironmentObject”或其他东西来保留应用程序运行时用户会话的状态。
@State
仅用于查看内部状态,例如隐藏/显示某物、突出显示等,但持久视图模型应该存储在外部某处,是的,它可能是
@EnvironmentObject
@ObservedObject
(到observeObject),等等。如果必须将此视图状态存储在某个位置,而不是简单地保留视图并能够显示/隐藏视图的同一实例(如果已经创建了实例的话),这似乎有点过分了。我想我可以尝试使用TabbedView查看是否会保留选项卡内容视图。您可以在列表中绑定所选项目,但列表不会滚动到所选项目,而且似乎没有API来执行此操作。