Передача данных на предыдущий видконтроллер VIPER - PullRequest
2 голосов
/ 18 марта 2020

Я использую архитектуру VIPER в iOS swift. У меня есть 2 viewcontrollers, скажем, A и B. Сначала я иду от A к B, выполняя некоторые задачи и возвращаясь от B к A. С MVC или MVVM мы можем создавать протоколы и передавать данные из B в A. Но для VIPER я в замешательстве. Вот мой VIPER код B, а кнопка Назад нажата:

Просмотр:

@IBAction func backButtonTapped(_ sender: UIButton) {
    presenter?.goBack()
}

Ведущий:

func goBack() {
    router.back()
}

Маршрутизатор:

func back() {
    viewController?.navigationController?.popViewController(animated: true)
    //here I want to send data back to previous viewcontroller
}

Я попытался создать один метод в Router из предыдущего контроллера и отправить данные этим методом, но он не работает, так как у маршрутизатора нет ни одного экземпляра презентатора или чего-либо еще , кроме просмотра.

1 Ответ

1 голос
/ 18 марта 2020

Примечание: - В Viper Router есть однонаправленный. Так что это может вам помочь.

  1. Реализация ProtocolDelegate в V C
  2. текущего модуля Создайте переменную делегата в маршрутизаторе следующего модуля
  3. Затем просто отправьте делегатскую зависимость к маршрутизатору следующего модуля
  4. и вызовите свой метод делегата из маршрутизатора следующего модуля.

Модуль A

final class VCA: SomeProtocolDelegate {
 fund someMethod() {
      //Your task Action From Module B
    }
 }

final class ModuleARouter: WireFrameProtocol {
    fund gotoModuleB(withView vc: VCA) {
       ModuleBRouter.load(onView: vc)
    }
}

Модуль B

final class ModuleBRouter: WireframeProtocol {
    internal weak var delegate: SomeProtocolDelegate?
    // Here you  can add more argument on load method for delegate 
    // since in this example i'm send data back ViewController So I didn't create 
    class func load(onView VC: UIViewController) {
        //setup your VIPER protocol and class
        if let vCA = VC as? VCA {
            router.delegate = vCA
        }
    }

   func backToPreviousModule() {
      self.delegate?. someMethod()
   }
}
...