Как стать автором
Обновить

Комментарии 2

Я пытаюсь разобраться с тем как реализована передача данных из одного модуля в другой. Представим, что у нас есть два модуля: ItemList (UITableViewController со списком сущностей типа ItemEntity) и ItemForm (UIViewController, где можно отредактировать поля выбранного ItemEntity).
1. Пользователь тыкает по строчке с Item
2. tableView сообщает своему Presenter, что didSelectItemAtIndexPath
3. Presenter сообщает своему Router, что надо открыть форму ItemFormViewController (withSegueIdentifier: «to item form»)
4. по слайдам — у Router-а, есть ссылка на TransitionHandler, у которого есть метод openModule(segueIdentifier: String, block: (..) -> Void); этот метод ретранслируется в performSegue;
5. А вот тут начинаются трудности…

Во-первых, не понятно какой должен быть параметр у block: (… тут..) -> Void. Т.к. ожидаемо, что это будет ModuleBInputProtocol. Но мы тут как бы не должны завязываться на модуль B (мы же хотим, чтоб этот метод открывал и другие модули, или нет?). Можно сделать во ViewController такое:
func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject?) {
  if segueIdentifier == "to item form" {
    let configHolder = segue.destinationViewController as! ModuleBConfigurationHolder
    let input = configHolder.moduleInput as! ModuleBInputProtocol
    let configBlock = sender as! ((input: BaseModuleInput) -> Void)
    configBlock(input)
  } else if segueIdentifier == "to next page" {
    .. то же самое что и выше, только другой модуль ..
  } ..
}


Но это ж бред…

Т.е. по картинкам и слайдам кажется, что понятно, но когда пытаюсь реализовать (на swift-е), получается *** какая то.
Не знаю правильно ли я все понял… но, в целом, описанная выше методология, оказалась в разы удобней, чем один роутер на все приложение. И передача параметров и все остальное.

Спасибо за доклады! На много лучше начал понимать КАК надо делать VIPER.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий