Где и как выполнять переходы в архитектуре 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". На мой взгляд, это не очень хороший подход.

Другие вопросы по тегам