4

作为初学者,我曾经在ViewControllers. 此外,Apple 鼓励这种方法,因为UIViewController有方法performSegueprepareForSegue.

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

在此处输入图像描述

Router不得与View.

我绝对不想拒绝使用segues,因为它非常强大,让我可以轻松地在ViewControllers.

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

4

3 回答 3

5

在纯 VIPER 中,所有转换都应在路由器中执行。因此,如果您选择实施 VIPER,您将无法使用 segues

于 2018-03-08T18:57:51.863 回答
3

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

于 2018-01-02T11:09:22.793 回答
2

抱歉我来晚了一点。我很确定你已经找到了自己的方法。虽然我认为有人可能会觉得这很有用。

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

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

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

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

Storyboards 的 segues 方法不是 VIPER,因为它的“视图”(在这种情况下为视图控制器)知道路由决策,而在 VIPER 中,它的唯一责任是 UI,向演示者发送操作并由它更新。

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

于 2018-05-17T13:31:24.237 回答