【发布时间】:2014-09-11 18:55:36
【问题描述】:
设置:我正在尝试创建一个带有嵌入式 UIPageViewController 的 ViewController,其中包含 4 个页面,每个页面都是它们自己的 ViewController。
问题:滚动第二个视图时总是重复。例如,使用 View1、View2、View3、View4 滚动显示 View1、View2、View2、View3、View4 然后向后滚动具有 View4、View3、View3、View2、View1 的顺序,即使页面控制是准确的。
这是我的页面视图控制器类:
import UIKit
class HostGamePageViewController: ROLViewController, UIPageViewControllerDelegate, UIPageViewControllerDataSource {
// Constants
let ViewControllers: NSArray = ["HostGameTest1", "HostGameTest2", "HostGameTest3", "HostGameTest4"]
// Properties
var pageViewController: UIPageViewController!
var currentViewController: String!
// UI
@IBOutlet var pageControl: UIPageControl!
override func viewDidLoad() {
super.viewDidLoad()
pageViewController = storyboard?.instantiateViewControllerWithIdentifier("HGPageViewController") as? UIPageViewController
pageViewController.delegate = self
pageViewController.dataSource = self
let startingViewController = viewControllerAtIndex(0)!
pageViewController.setViewControllers([startingViewController], direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: {done in })
addChildViewController(pageViewController)
view.addSubview(pageViewController.view)
pageViewController.view.frame = view.bounds
pageViewController.didMoveToParentViewController(self)
view.gestureRecognizers = pageViewController.gestureRecognizers
// Setup page controls
pageControl.numberOfPages = ViewControllers.count
view.bringSubviewToFront(pageControl)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// Get the index of the current page view
func indexOfViewController() -> Int {
if currentViewController != nil {
return ViewControllers.indexOfObject(currentViewController)
}
return NSNotFound
}
// Get the view controller of the given index
func viewControllerAtIndex(index: Int) -> UIViewController? {
if ViewControllers.count == 0 || index >= ViewControllers.count {
return nil
}
pageControl.currentPage = index
currentViewController = ViewControllers[index] as String
return storyboard?.instantiateViewControllerWithIdentifier(currentViewController) as? ROLViewController
}
// Handle clicks on the page control
@IBAction func pageControlClick(sender: UIPageControl) {
var direction: UIPageViewControllerNavigationDirection
if sender.currentPage < indexOfViewController() {
direction = UIPageViewControllerNavigationDirection.Forward
} else {
direction = UIPageViewControllerNavigationDirection.Reverse
}
if let viewController = viewControllerAtIndex(sender.currentPage) {
pageViewController.setViewControllers([viewController], direction: direction, animated: false, completion: nil)
}
}
func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
var index = indexOfViewController()
if index == 0 || index == NSNotFound {
return nil
}
index--
return viewControllerAtIndex(index)
}
func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
var index = indexOfViewController()
if index == NSNotFound {
return nil
}
index++
if index == ViewControllers.count {
return nil
}
return viewControllerAtIndex(index)
}
}
这里是我的故事板屏幕截图的链接: http://f.cl.ly/items/0V3W133Q34170q39393Q/Image%202014-09-11%20at%2011.49.44%20AM.png
我是否错误地设置了 dateSource?我在某处读到 UIPageViewController 通过将动画设置为 false 来进行一些缓存,这是所谓的修复,但没有为我做任何事情。任何帮助将非常感激。谢谢!
【问题讨论】:
-
我找到了解决这个问题的方法。而不是从 beforeView 和 afterView 调用返回 HostGameView1、HostGameView2 等。相反,我总是使用一个包装视图控制器,然后告诉该包装视图控制器要呈现什么视图。这似乎奏效了。
标签: ios swift uipageviewcontroller