我正在尝试在具有多个 View Controller 的 Swift 应用程序中使用 UIPageViewController
。我的 Storyboard 上有 2 个 View Controller (firstViewController
和 secondViewController
),它们都嵌入在它们自己的导航 Controller 中。它们具有 Storyboard标识符“FirstViewController
”和“SecondViewController
”。我的 Storyboard上还有一个带有 identifierPageView
Controller 的页面 View Controller ,并将导航设置为水平和过渡样式以在属性检查器中滚动。 FirstViewController
是应用的 Root View Controller
我希望 firstViewController
成为页面 View Controller 的第一页,所以我编写了它的类:
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
}
}
但是,当我运行我的应用程序时,它似乎没有页面 View Controller 。它只是显示 firstViewController
而已。没有点,没有页面等。有人知道怎么了吗?我找到了几个 Objective-C 教程,但它们都涵盖了对所有页面使用一个 View Controller ,并且有一个 Root View Controller ,它不是 pageView
中的一个页面,所以它们不是太很有帮助。我希望它会像使用 tabBarController
一样,您只需单击并拖动到 View Controller ,但不幸的是情况并非如此。就像我说的,我以前没有使用过其中一个,所以我有点迷路了。
更新:
按照 iiFreeman 的建议,我对 UIPageViewController
进行了子类化,并使其成为我 Storyboard文件中的根目录。下面是子类
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 失去了与模拟器的连接。我不太确定发生了什么。
最佳答案
好的,我明白了。因为我需要页面 View Controller 作为根并处理所有事情,所以我按照 iiFreeman 的建议将 UIPageViewController
子类化并符合委托(delegate)和数据源协议(protocol)。然后,我在 viewDidLoad
中设置了 Controller ,并实现了委托(delegate)和数据源方法。我添加了一个属性存储一组 Storyboard 标识符以及一个用于跟踪该数组的当前索引的标识符。我还添加了一个辅助方法来返回给定索引的正确 View Controller 。我的其他 tableView
Controller 子类中不需要任何东西,因为我的页面 View Controller 正在处理所有事情。我确实意识到的一件事是,因为我的 tableViewController
嵌入了导航 Controller ,所以我的页面 View Controller 实际上需要显示导航 Controller ,而不是 tableView
Controller 。下面是我的实现:
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
}
}
关于ios - 将 UIPageViewController 与快速和多 View Controller 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25387436/