strongself / The-Book-of-VIPER

the one and the only
Other
958 stars 129 forks source link

Работа UIPageViewController в Viper #30

Closed SpectralDragon closed 8 years ago

SpectralDragon commented 8 years ago

Всем привет. Подскажите как сделать UIPageViewController используя VIPER? Используя MVC, я бы не парился и просто создал экземпляр нужного контроллера. В таком случае, мой код, примерно, выглядел бы так:

extension MainViewController: UIPageViewControllerDataSource {

    func viewControllerAtIndex(index: Int) -> ShowImageViewController? {

        if self.image.count == 0 || index >= self.image.count {
            return nil
        }

        let pageContent = ImageViewController()
        pageContent.previewImage = self.image[index]

        pageContent.pageIndex = index
        self.currentPage = index

        return pageContent
    }

    func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {

                var index = (viewController as! ShowImageViewController).pageIndex

                index += 1

                return viewControllerAtIndex(index)
    }

    func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {

                var index = (viewController as! ShowImageViewController).pageIndex

                index -= 1

                return viewControllerAtIndex(index)
    }

}

Но правильно ли, содержать в VIPER экземпляры других контроллеров во View? Вероятно что нет, но куда мне деть логику показа нового контроллера? В Router?

Заранее спасибо :)

alextov commented 7 years ago

Тоже интересует этот вопрос. Я думал о создании DataDisplayManagerа, аналогичного таковому для таблиц и коллекций, только реализующего соответственно протоколы UIPageViewControllerDataSource и UIPageViewControllerDelegate. В таком случае дочерние вью контроллеры поставлялись бы ему извне, но вот как их лучше всего создавать и где это делать? Определенно не во вью контроллере, и, скорее всего, не в ассемблере. Презентеру не желательно вообще знать про UIKit. Остается роутер, который должен роутить, да только переходов здесь нет. Словом, если хорошее решение этой задачи существует, то оно не вполне очевидно.