导航后不要破坏视图

Posted

技术标签:

【中文标题】导航后不要破坏视图【英文标题】:Don't destroy view after navigating 【发布时间】:2020-12-05 01:10:25 【问题描述】:

我有一些视图(我们将其命名为视图 A),其中包含项目列表。点击特定项目后,它会引导用户查看详细信息(视图 B)。视图 A 中的列表很长,因此我想在单击视图 B 中的后退按钮时为用户保留滚动位置和列表。现在,当单击视图 B 中的后退按钮时,视图 A 被加载为新视图。有没有一些方便的方法来实现这一点?另外,如果用户从视图 B 到其他任何地方,如何手动销毁该视图?

通过以下方式实现从 A 到 B 的导航:

NavigationLink(destination: DetailsView(), isActive: $redirectToDetails)  EmptyView() 

使用默认的快速后退按钮实现从 B 到 A 的导航。

编辑 1:

第 1 步:用户向下滚动列表并点击某个位置,导航到详细信息视图

第 2 步:用户在详细信息视图中并单击返回按钮

第 3 步:用户导航回列表视图,列表视图执行数据加载,列表滚动到顶部。

我想以某种方式保留渲染视图(从步骤 1 开始),因此当用户返回时不会再次加载数据并且列表滚动位置与执行导航到详细信息视图时的位置完全相同。

【问题讨论】:

视图未“加载”或“销毁”。它们不是您在界面中看到的东西。它们只是运行的轻量级描述。如果您有需要保存的状态,请保存它,即将其构建到描述中。 那么我需要手动加载这个状态,对吧? 我认为有一些方法可以自动生成 不清楚你的意思,你会在演示代码中显示这个吗? 我不确定如何在代码中显示这一点,但我编辑了我的问题。 【参考方案1】:

我认为您正在 viewWillAppear 或 viewDidAppear 方法中获取视图 A 中的数据,或者/并且您正在 viewWillAppear 或 viewDidAppear 上重新加载 tableView。如果您将此获取和重新加载 tableview 代码移动到 viewDidLoad() 那么您的问题将得到解决。

【讨论】:

感谢您的评论。我正在使用 SwiftUI,所以我在 .onAppear 中获取我的数据。如果我错了,请纠正我,但我认为 viewDidLoad 在 SwiftUI 中不可用。

以上是关于导航后不要破坏视图的主要内容,如果未能解决你的问题,请参考以下文章

尝试更改邮件撰写导航栏文本颜色

将子视图添加到自定义 viewForHeaderInSection 会中断 VoiceOver 导航

导航栏 removeGestureRecognizer 未删除 Guesture

swiftUI:登录完成后导航到主屏幕。通过按钮单击导航视图

转到不在底部导航视图内的片段并返回后,底部导航视图不起作用

从搜索控制器导航后缺少导航栏