2016-04-26 28 views
2

我遵循基本教程here来创建一个UIPageViewController,通过不同的ViewControllers进行滑动,所有这些都是我在Main.Storyboard上创建的。我想创建一个生成动态ViewControllers的应用程序,这意味着我将不得不以编程方式实例化UIPageViewController中的ViewControllers。如何构建一个动态UIPageViewController

但是,我正试图让所有事情进一步深入。我将根据Firebase中的数据显示一组动态ViewController。在每次刷卡时,我想实例化一个将包含图像的视图(该图像将存储在Amazon Web Services上,并且该图像的链接将存储在Firebase中)。我目前在我的Android应用程序中有这个设置,并使用Picasso将图像加载到我的片段中。

由于所有的数据将是动态的,我想找到的最佳方式:基于改变每一天

- 具备每视图控制器显示动态火力数据

-Instantiate新ViewControllers我已经存储在Firebase中的相​​关图像

所有的ViewController将具有相同的“骨架”,这意味着每个人都会有一个伴有一些文本的图像。以下是我目前的代码,我希望得到一些建议/协助。

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] 
    } 
} 
+0

嗨,最终目标是什么?它应该如何为用户工作?它看起来像一个图片库,如果是这样,我不认为你需要“拥有一组动态的ViewController”。所有你需要的是一个cell.size = screen.size的集合视图。无论如何,如果你需要这个集合,我想通过它的变量来启动它是更好的方法。给予更多细节。 –

+0

它基本上是一个投票应用程序。每天我都会有一定数量的民意调查。我希望每个ViewController用一个图像,一个问题和投票按钮来表示轮询。这是动态的,因为在第1天可能有10个民意调查,第2天只有3个民意调查...... – tccpg288

回答

1

后新的意见,我会做这种方式:

  1. 请与变量文本,图像,ID,一天的等等一些民意调查的对象。

  2. 请与投票对象初始化的PollViewModel,那将是应对数据呈现

  3. 做一个的UIViewController /的UITableViewController子类与PollViewModel

  4. 初始化做的UITableViewCell的子类投票的每一个部分UI,可以在UITableView中显示它

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

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