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

时间:2018-01-02 10:05:25

标签: swift design-patterns segue transition viper

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

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

enter image description here

Router不得与View绑定。

我绝对不想拒绝使用segues,因为它功能非常强大,可让我轻松地在ViewControllers之间传输数据。

那么,我应该如何在ViewControllers

之间执行转换

3 个答案:

答案 0 :(得分:2)

在纯VIPER中,所有转换都应在Router中执行。因此,如果您选择实施VIPER

,则无法使用segues

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

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

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

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

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

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