作为初学者,我曾经在ViewControllers
中执行segues。此外,Apple鼓励采用这种方法,因为UIViewController
有方法performSegue
和prepareForSegue
。
但是学习VIPER,我读到Router
负责场景之间的转换。第二件事是根据这样的VIPER流程图:
Router
不得与View
绑定。
我绝对不想拒绝使用segues
,因为它功能非常强大,可让我轻松地在ViewControllers
之间传输数据。
那么,我应该如何在ViewControllers
?
答案 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'。 在我看来,这不是一个好方法。