我已经按照基本教程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]
}
}
答案 0 :(得分:1)
在发表新评论后,我会这样做:
使用变量text,images,id,day等来制作一些Poll对象。
使用Poll对象初始化PollViewModel,它将响应数据显示
使用PollViewModel初始化UIViewController / UITableViewController子类
为poll UI的每个部分创建一个UITableViewCell的子类,可以在UITableView中显示它
使用FireBase中的当前Poll对象数组初始化PageViewTutorial类(或其自己的ViewModel)
在UIPageViewControllerDataSource中处理来自数组的对象,并返回使用带有poll对象初始化的模型初始化的vc。 ;)