在VIPER架构中何处以及如何执行segue?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在VIPER架构中何处以及如何执行segue?相关的知识,希望对你有一定的参考价值。

作为初学者,我曾经在ViewControllers执行segues。此外,Apple鼓励这样的方法,因为UIViewController有方法performSegueprepareForSegue

但是学习VIPER,我读到Router负责场景之间的过渡。第二件事就是根据这样的VIPER流程图:

enter image description here

Router不得与View绑在一起。

我绝对不想拒绝使用segues,因为它非常强大,并且允许我在ViewControllers之间轻松传输数据。

那么,我应该如何在ViewControllers之间进行转换?

答案

在纯VIPER中,所有转换都应在Router中执行。如果您选择实施VIPER,那么您将无法使用segues

另一答案

我个人更喜欢使用Storyboard ID而不是segues。例如 : 1.为您的视图添加相关的故事板ID。 image link. 2.然后你可以访问该视图:let loginVC = UIStoryboard(name: "Main", bundle:nil).instantiateViewController(withIdentifier: "Login") 你可以用它来传递数据:loginVC.type = 0 你可以随时访问它:navigationController?.pushViewController(loginVC, animated: true)

另一答案

对不起,我有点晚了。我很确定你想出了自己的方式。虽然我认为有人可能会觉得这很有用。

您的路由器应该创建模块并决定如何转到该模块。演示者告诉路由器去哪里,路由器告诉如何去那里。

每个模块的路由器都知道它自己的视图控制器。

如何完成路由取决于您和路由器“路由”功能中实现的代码。如果它只是将下一个模块推送到您的导航堆栈,您的路由功能将调用下一个路由器的'createModule()',然后您只需执行以下操作:

self.viewController?.navigationController?.pushViewController(nextModuleVC)

故事板的segues方法在其诞生时不是VIPER,因为'view'(在这种情况下为View控制器)知道路由决策,在VIPER中,唯一的责任是UI,向演示者发送动作并由其更新。

如果您仍然想要这样做,您可以在视图控制器之间创建segue,然后当用户点击按钮时,例如,您可以将操作发送到演示者,演示者将通知路由器,然后路由器将叫'performSegue'。在我看来,这不是一个好方法。

以上是关于在VIPER架构中何处以及如何执行segue?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 架构模式--解密 MVC,MVP,MVVM以及VIPER架构

iOS-架构模式--解密 MVC,MVP,MVVM以及VIPER架构

在具有 VIPER 架构的应用程序上更新 NSManagedObject

如何在 UITabBarController 中使用 Viper 架构

iOS VIPER架构

iOS架构:MVC, MVP, MVVM以及VIPER