Где и как выполнять переходы в архитектуре VIPER?
Как начинающий, я имел обыкновение выполнять переходы в ViewControllers
, Более того, Apple поощряет такой подход, потому что UIViewController
имеет методы performSegue
а также prepareForSegue
,
Но, изучая VIPER, я прочитал это Router
отвечает за переходы между сценами. И второе, что согласно блок-схемам VIPER:
Router
не должен быть связан с View
,
Я абсолютно не хочу отказываться от использования segues
потому что это очень мощный и позволяет мне легко передавать данные между ViewControllers
,
Итак, как я должен выполнять переходы между ViewControllers
?
3 ответа
В чистом VIPER все переходы должны выполняться в роутере. Таким образом, вы не сможете использовать сегменты, если решите внедрить VIPER
Лично я предпочитаю использовать 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)
Извините, я немного опоздал. Я почти уверен, что ты понял свой путь. Хотя я думаю, что кто-то может найти это полезным.
Ваш маршрутизатор должен создать модуль и решить, как перейти к этому модулю. Ведущий сообщает маршрутизатору, куда идти, и маршрутизатор говорит, как туда идти.
Маршрутизатор каждого модуля знает свой собственный контроллер представления.
Как выполняется маршрутизация, зависит от вас и кода, который вы реализуете в функции "маршрутизации" вашего маршрутизатора. Если он просто помещает следующий модуль в ваш стек навигации, ваша функция маршрутизации вызовет функцию createModule() следующего маршрутизатора, а затем вы просто сделаете что-то вроде:
self.viewController?.navigationController?.pushViewController(nextModuleVC)
Подход сегментов раскадровок не является VIPER по своей сути, потому что "представление" (в данном случае контроллер View) знает о решениях о маршрутизации, тогда как в VIPER единственная ответственность - это пользовательский интерфейс, отправка действий презентатору и его обновление.
Если вы все еще хотите это сделать, вы можете создать переходы между контроллерами представления, а затем, когда пользователь, например, нажимает кнопку, вы можете отправить действие докладчику, докладчик уведомит маршрутизатор, а затем маршрутизатор вызовите "executeSegue". На мой взгляд, это не очень хороший подход.