Comments 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 такое:
Но это ж бред…
Т.е. по картинкам и слайдам кажется, что понятно, но когда пытаюсь реализовать (на swift-е), получается *** какая то.
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-е), получается *** какая то.
Sign up to leave a comment.
По итогам Rambler.iOS V