如何使SwiftUI侧边栏菜单(在macOS上)每次显示相同的DetailView而不是创建新的?

3
我有一个macOS的Master/Detail应用程序,使用侧边栏菜单的NavigationView在左侧面板中,并在右侧面板中显示各种详细视图。
我希望保留详细视图,当用户选择不同的侧边栏菜单选项时,这样如果用户通过选择先前选择的菜单选项进行切换,则应用程序应该显示最初创建的详细视图以及任何用户更改或选择。
目前,似乎SwiftUI在选择菜单选项时会从头开始创建新视图,而不是仅显示先前创建的视图。例如,如果详细视图具有ListView,并且用户先前选择了项目,则此选择将丢失,以及任何先前的滚动位置。
是否有任何方式使用SwiftUI实现这一点?

目前SwiftUI不支持滚动位置的持久性,但是选择、用户更改等所有其他内容都应该按概念存储在模型中,并在视图再次出现时由视图呈现。因此,你需要重新思考应用程序的设计。并且你无法保留视图,因为它只是结构体值。 - Asperi
嗯,这正是我所怀疑的,因此使用“@State”实际上是无用的,因为它会丢失,而在应用程序运行时需要使用“@EnvironmentObject”或其他东西来保留用户会话的状态。 - Duncan Groenewald
@State 仅用于视图内部状态,如隐藏/显示某些内容,突出显示等,但是持久的视图模型应该存储在外部,可以使用 @EnvironmentObject@ObservedObject(针对 ObservableObject)等。 - Asperi
似乎将此视图状态存储在某处而不是保留视图并能够显示/隐藏已创建的视图实例似乎过于浪费。我猜我可以尝试使用TabbedView来查看是否会保留选项卡内容视图。 - Duncan Groenewald
2个回答

0

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

旧的 UITabBarController 保持其子视图控制器的活动状态的方式可能被认为是错误的,并且浪费内存。


您可以将列表中的选定项绑定,但是列表不会滚动到选定项,并且似乎没有API可以实现该功能。 - Duncan Groenewald

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接