如何构建一个动态的 UIPageViewController
How to Build A Dynamic UIPageViewController
我已经按照基本教程 here 创建了一个 UIPageViewController,它可以在不同的 ViewController 中滑动,所有这些都是我在 Main.Storyboard 上创建的。我想创建一个生成动态 ViewControllers 的应用程序,这意味着我必须以编程方式在 UIPageViewController 中实例化 ViewControllers。
但是,我正在努力使一切更进一步。我将根据我在 Firebase 中的数据显示一组动态的 ViewController。在每次滑动时,我想实例化一个将包含图像的视图(图像将存储在 Amazon Web Services 上,图像的 link 将存储在 Firebase 中)。我目前在我的 Android 应用程序中进行了此设置,并使用 Picasso 将图像加载到我的片段中。
由于所有数据都将是动态的,我想找到最佳方法:
-根据每天变化的动态 firebase 数据实例化新的 ViewControllers
-让每个 ViewController 显示我存储在 Firebase
中的关联图像
所有 ViewController 都将具有相同的 "skeleton,",这意味着每个人都会有一张图片和一些文字。以下是我目前的代码,我希望得到一些建议/帮助。
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]
}
}
在收到新评论后我会这样做:
制作一些带有变量文本、图像、id、日期等的 Poll 对象。
创建一个用Poll对象初始化的PollViewModel,它将响应数据呈现
使用 PollViewModel
初始化一个 UIViewController/UITableViewController subclass
为投票 UI 的每个部分创建 UITableViewCell 的子classes,可以显示在 UITableView 中
使用来自 FireBase
的当前轮询对象数组初始化 PageViewTutorial class(或其自己的 ViewModel)
在 UIPageViewControllerDataSource 中处理数组中的对象和 return vc 使用模型初始化并使用 poll 对象初始化。 ;)
我已经按照基本教程 here 创建了一个 UIPageViewController,它可以在不同的 ViewController 中滑动,所有这些都是我在 Main.Storyboard 上创建的。我想创建一个生成动态 ViewControllers 的应用程序,这意味着我必须以编程方式在 UIPageViewController 中实例化 ViewControllers。
但是,我正在努力使一切更进一步。我将根据我在 Firebase 中的数据显示一组动态的 ViewController。在每次滑动时,我想实例化一个将包含图像的视图(图像将存储在 Amazon Web Services 上,图像的 link 将存储在 Firebase 中)。我目前在我的 Android 应用程序中进行了此设置,并使用 Picasso 将图像加载到我的片段中。
由于所有数据都将是动态的,我想找到最佳方法:
-根据每天变化的动态 firebase 数据实例化新的 ViewControllers
-让每个 ViewController 显示我存储在 Firebase
中的关联图像所有 ViewController 都将具有相同的 "skeleton,",这意味着每个人都会有一张图片和一些文字。以下是我目前的代码,我希望得到一些建议/帮助。
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]
}
}
在收到新评论后我会这样做:
制作一些带有变量文本、图像、id、日期等的 Poll 对象。
创建一个用Poll对象初始化的PollViewModel,它将响应数据呈现
使用 PollViewModel
初始化一个 UIViewController/UITableViewController subclass
为投票 UI 的每个部分创建 UITableViewCell 的子classes,可以显示在 UITableView 中
使用来自 FireBase
的当前轮询对象数组初始化 PageViewTutorial class(或其自己的 ViewModel)
在 UIPageViewControllerDataSource 中处理数组中的对象和 return vc 使用模型初始化并使用 poll 对象初始化。 ;)