如何构建动态UIPageViewController

时间:2016-04-26 20:38:32

标签: ios swift firebase viewcontroller uipageviewcontroller

我已经按照基本教程here创建了一个UIPageViewController,它可以浏览不同的ViewControllers,我在Main.Storyboard上创建了所有这些。我想创建一个生成动态ViewControllers的应用程序,这意味着我必须以编程方式在UIPageViewController中实例化ViewControllers。

但是,我试图进一步采取一切措施。我将根据Firebase中的数据显示一组动态的ViewControllers。在每次滑动时,我想实例化一个包含图像的视图(图像将存储在Amazon Web Services上,图像链接将存储在Firebase中)。我目前在我的Android应用程序中进行了此设置,并使用Picasso在我的片段中加载图像。

由于所有数据都是动态的,我想找到最好的方法:

- 根据每天更改的动态firebase数据来实例化新的ViewControllers

- 让每个ViewController显示我存储在Firebase中的相​​关图像

所有ViewControllers都具有相同的"骨架,"意思是每个人都会有一个伴随着一些文字的图像。以下是我目前的代码,我希望得到一些建议/帮助。

import UIKit

class PageViewTutorial: UIPageViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        dataSource = self
        if let firstViewController = orderedViewControllers.first {
            setViewControllers([firstViewController],
                direction: .Forward,
                animated: true,
                completion: nil)
        }
    }

    //this will be dynamic based on firebase data
    private(set) lazy var orderedViewControllers: [UIViewController] = {
        return [self.newColoredViewController("Green"),
            self.newColoredViewController("Red"),
            self.newColoredViewController("Blue")]
    }()

    private func newColoredViewController(color: String) -> UIViewController {
        return UIStoryboard(name: "Main", bundle: nil) .
            instantiateViewControllerWithIdentifier("\(color)ViewController")
    }



}


// MARK: PageViewTutorialDataSource

extension PageViewTutorial: UIPageViewControllerDataSource {

    func pageViewController(pageViewController: UIPageViewController,
        viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
            guard let viewControllerIndex = orderedViewControllers.indexOf(viewController) else {
                return nil
            }

            let previousIndex = viewControllerIndex - 1

            guard previousIndex >= 0 else {
                return nil
            }

            guard orderedViewControllers.count > previousIndex else {
                return nil
            }

            return orderedViewControllers[previousIndex]
    }

    func pageViewController(pageViewController: UIPageViewController,
        viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
            guard let viewControllerIndex = orderedViewControllers.indexOf(viewController) else {
                return nil
            }

            let nextIndex = viewControllerIndex + 1

            let orderedViewControllersCount = orderedViewControllers.count

            guard orderedViewControllersCount != nextIndex else {
                return nil
            }

            guard orderedViewControllersCount > nextIndex else {
                return nil
            }

            return orderedViewControllers[nextIndex]
  }
}

1 个答案:

答案 0 :(得分:1)

在发表新评论后,我会这样做:

  1. 使用变量text,images,id,day等来制作一些Poll对象。

  2. 使用Poll对象初始化PollViewModel,它将响应数据显示

  3. 使用PollViewModel初始化UIViewController / UITableViewController子类

  4. 为poll UI的每个部分创建一个UITableViewCell的子类,可以在UITableView中显示它

  5. 使用FireBase中的当前Poll对象数组初始化PageViewTutorial类(或其自己的ViewModel)

  6. 在UIPageViewControllerDataSource中处理来自数组的对象,并返回使用带有poll对象初始化的模型初始化的vc。 ;)