ios - 将 UIPageViewController 与快速和多 View Controller 一起使用

标签 ios swift uipageviewcontroller

我正在尝试在具有多个 View Controller 的 Swift 应用程序中使用 UIPageViewController。我的 Storyboard 上有 2 个 View Controller (firstViewControllersecondViewController),它们都嵌入在它们自己的导航 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
    }

}

this post helped me out a lot

关于ios - 将 UIPageViewController 与快速和多 View Controller 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25387436/

相关文章:

ios - 如何在水平 UIPageViewController 中实现垂直 UIPageViewController

ios - 我应该继承 UIPageViewController 吗?

ios - 动态证书固定

ios - 如何为不同的 iOS 应用配置文件包含不同的 plist

ios - 从主屏幕加载应用程序时调用什么函数?

swift - CGRectZero 与 CGRect.zeroRect?

ios - 从另一个类快速调用文本字段

ios - 如何在 View Controller 之间同步索引

ios - 应用程序是否包含、显示、访问第三方内容(应用程序商店审核)

ios - 基于 bool 值比较两个数组和匹配元素