如何快速刷新所有视图控制器

Posted

技术标签:

【中文标题】如何快速刷新所有视图控制器【英文标题】:How to refresh all view controllers in swift 【发布时间】:2019-06-19 03:16:51 【问题描述】:

我有一个应用程序,一旦用户登录,他们就会一直保持登录状态,直到退出。登录后,会显示一些样式方面,例如“名称”,供用户查看。我的问题是,当我以“user1”身份登录然后我注销并以“user2”身份登录时,视图仍然向用户显示“user1”。这是因为在我的 TabBarController 上的 viewdidload() 中设置了包含“user1”的文本,当我注销/登录时,不会再次调用 viewDidLoad(),因此文本保持不变。一旦我再次登录,是否有一些函数或方法可以在我的所有 ViewControllers 上调用 viewDidLoad()?

我尝试了 ViewDidAppear(...) 但我真的不想在每次用户单击 VC 时调用数据库来接收名称

【问题讨论】:

您应该在 ViewWillAppear/ViewDidAppear 中更新您的视图并在用户登录时加载该数据。如果您将加载和显示结合起来,那么您做错了。查看缓存和承诺库 Resetting Storyboard on Logout的可能重复 Dane,您在登录和注销状态之间有哪些转换?是推/流行吗?你使用故事板吗?你使用segues吗?调用 [viewController 视图];会再次调用整个生命周期 - 包括 viewDidLoad,但根本不建议这样做,我可以指导您如何在不违反规则的情况下执行此操作。 【参考方案1】:

我认为您将要登录。来自标签栏导航控制器的页面。 loginpage 不应在该层次结构中。 1.您仍然可以使用 viewwillappear 使其成为可能 2.我们可以在视图didload中进行,这是推荐的方法。 为登录页面制作单独的导航控制器,并根据需要的业务流程设置窗口rootviewcontroller。这样,一旦您注销,更改窗口的 rootviewcontroller,以便整个 tabbar 控制器将从内存中删除,然后您登录,将根视图控制器更改为 tabbarcontroller,现在将调用 viewdidload

【讨论】:

你会为 goToLogin() 函数使用什么代码?我使用了 window.rootviewcontroller = ..... 它会运行其他 vc 的代码,但不会在 UI 中显示它。【参考方案2】:

您可以使用 NotificationCenter 并发送自定义通知“登录”。 如果某个对象(例如 VC)依赖于 User,则该 VC 需要订阅此通知并更新状态。 文档https://developer.apple.com/documentation/foundation/notificationcenter 简单示例https://medium.com/@JoyceMatos/using-nsnotificationcenter-in-swift-eb70cf0b60fc

其他方式重置导航堆栈,例如

window.rootViewController = someNewNavigationController

【讨论】:

以上是关于如何快速刷新所有视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 如何快速识别视图(View)界面的刷新是由哪个状态的改变导致的?

SwiftUI 如何快速识别视图(View)界面的刷新是由哪个状态的改变导致的?

删除 tableview 单元格并刷新视图控制器后刷新 tableview

如何使用新数据重新加载或刷新选项卡栏控制器的选项卡栏中的数据?

如何刷新视图控制器

如何使视图控制器仅在用户第一次快速打开应用程序时出现