使用UIPageViewController和swift和多视图控制器

我试图在多个视图控制器的Swift应用程序中使用UIPageViewController 。 我有两个视图控制器在我的故事板( firstViewControllersecondViewController )都embedded在自己的导航控制器。 他们有故事板标识符“ FirstViewController ”和“ SecondViewController ”。 我也有一个页面视图控制器在我的故事板与identifierPageView控制器,并将导航设置为水平和过渡样式滚动属性检查器。 FirstViewController是应用程序的根视图控制器

我想firstViewController成为页面视图控制器的第一页,所以我写了它的类如下所示:

 import Foundation import UIKit class FirsttViewController: UITableViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate { override func viewDidLoad() { let pageViewController: PageViewController = self.storyboard.instantiateViewControllerWithIdentifier("PageViewController") as PageViewController pageViewController.delegate = self var viewControllers: [UIViewController] = [self] pageViewController.setViewControllers(viewControllers, direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: nil) pageViewController.view.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height) self.addChildViewController(pageViewController) self.view.addSubview(pageViewController.view) pageViewController.didMoveToParentViewController(self) } func pageViewController(pageViewController: UIPageViewController!, viewControllerAfterViewController viewController: UIViewController!) -> UIViewController! { let secondViewController: SecondViewController = self.storyboard.instantiateViewControllerWithIdentifier("SecondViewController") as SecondViewController return secondViewController } func pageViewController(pageViewController: UIPageViewController!, viewControllerBeforeViewController viewController: UIViewController!) -> UIViewController! { return nil } func presentationCountForPageViewController(pageViewController: UIPageViewController!) -> Int { return 2 } func presentationIndexForPageViewController(pageViewController: UIPageViewController!) -> Int { return 0 } } 

SecondViewController的文件如下所示:

 import Foundation import UIKit class SecondViewController: UITableViewController, UIPageViewControllerDataSource { func pageViewController(pageViewController: UIPageViewController!, viewControllerAfterViewController viewController: UIViewController!) -> UIViewController! { return nil } func pageViewController(pageViewController: UIPageViewController!, viewControllerBeforeViewController viewController: UIViewController!) -> UIViewController! { let firstViewController: FirstViewController = self.storyboard.instantiateViewControllerWithIdentifier("FirstViewController") as FirstViewController return firstViewController } } 

但是,当我运行我的应用程序似乎并没有一个页面视图控制器。 它只是显示firstViewController ,就是这样。 没有点,没有页面等任何人都知道什么是错的? 我find了几个Objective-C的教程,但是都覆盖了所有页面使用一个视图控制器,并且有一个根视图控制器不是pageView一个页面,所以他们没有太多的帮助。 我希望它会像使用tabBarController ,你只需点击并拖动到视图控制器,但不是不幸的情况。 就像我说过的,我之前没有和其中的一个合作过,所以我迷失了方向。

更新:

遵循iiFreeman的build议,我分类了UIPageViewController ,并将其作为我的故事板文件中的根。 下面是子类

 import Foundation import UIKit class PageViewController: UIPageViewController { override func viewDidLoad() { let startingViewController = self.storyboard.instantiateViewControllerWithIdentifier("FirstViewController") as FirstViewController self.dataSource = startingViewController var viewControllers: [UIViewController] = [startingViewController] self.setViewControllers(viewControllers, direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: nil) } } 

但是现在这个应用只是挂在黑屏上,最终Xcode失去了与模拟器的连接。 我真的不知道发生了什么事。

好的,我明白了。 因为我需要页面视图控制器为根,并处理一切,我将UIPageViewController为iiFreemanbuild议并符合委托和数据源协议。 然后我在viewDidLoad设置了控制器,并实现了委托和数据源方法。 我添加了一个属性存储一个故事板标识符数组,以及一个跟踪该数组的当前索引。 我还添加了一个辅助方法来返回给定索引的正确的视图控制器。 因为我的页面视图控制器正在处理所有事情,所以我在其他tableView控制器子类中不需要任何东西。 有一件事我意识到是因为我的tableViewController被embedded到导航控制器中,我的页面视图控制器实际上需要显示导航控制器,而不是tableView控制器。 下面是我的实现:

 import Foundation import UIKit class PageViewController: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate { var index = 0 var identifiers: NSArray = ["FirstNavigationController", "SecondNavigationController"] override func viewDidLoad() { self.dataSource = self self.delegate = self let startingViewController = self.viewControllerAtIndex(self.index) let viewControllers: NSArray = [startingViewController] self.setViewControllers(viewControllers, direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: nil) } func viewControllerAtIndex(index: Int) -> UINavigationController! { //first view controller = firstViewControllers navigation controller if index == 0 { return self.storyboard.instantiateViewControllerWithIdentifier("FirstNavigationController") as UINavigationController } //second view controller = secondViewController's navigation controller if index == 1 { return self.storyboard.instantiateViewControllerWithIdentifier("SecondNavigationController") as UINavigationController } return nil } func pageViewController(pageViewController: UIPageViewController!, viewControllerAfterViewController viewController: UIViewController!) -> UIViewController! { let identifier = viewController.restorationIdentifier let index = self.identifiers.indexOfObject(identifier) //if the index is the end of the array, return nil since we dont want a view controller after the last one if index == identifiers.count - 1 { return nil } //increment the index to get the viewController after the current index self.index = self.index + 1 return self.viewControllerAtIndex(self.index) } func pageViewController(pageViewController: UIPageViewController!, viewControllerBeforeViewController viewController: UIViewController!) -> UIViewController! { let identifier = viewController.restorationIdentifier let index = self.identifiers.indexOfObject(identifier) //if the index is 0, return nil since we dont want a view controller before the first one if index == 0 { return nil } //decrement the index to get the viewController before the current one self.index = self.index - 1 return self.viewControllerAtIndex(self.index) } func presentationCountForPageViewController(pageViewController: UIPageViewController!) -> Int { return self.identifiers.count } func presentationIndexForPageViewController(pageViewController: UIPageViewController!) -> Int { return 0 } } 

这个post帮了我很多

确定会导致FirstViewController – 您的故事板中的初始视图控制器

将一个自定义的UIPageViewController子类添加到故事板中,将其标记为初始内容并完成所有工作,通过UIPageViewController子类中的storyboardID实例化页面控制器成员,在另一个类中执行相同的操作

请注意,这段代码只能用于两个ViewController 。 如果你打算使用更多,你必须改变线路:

 self.index = self.index + 1 

在前后电话中find:

 self.index = index + 1 

调用当前的ViewController索引。