如何在 Swift 中实现 UIPageViewController 委托的 transitionCompleted?

How do I implement transitionCompleted of the UIPageViewController delegate in Swift?

如您所见,有两个 UIViewControllers(其中一个称为 ProView,充当另一个 UIViewController 和一个 UIPageViewController 的容器。

import UIKit

class ProView: UIViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {

var pageViewController: UIPageViewController?

let characterImages = ["character1", "character2"]

override func viewDidLoad() {
    super.viewDidLoad()
    createPageViewController()
    setupPageControl()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

func pageViewController(pageViewController: UIPageViewController,
    viewControllerAfterViewController ProView: UIViewController) -> UIViewController? {

        let itemController = ProView as PageItemController

        if itemController.itemIndex+1 < characterImages.count {
            return getItemController(itemController.itemIndex+1)
        }

        return nil
}

func pageViewController(pageViewController: UIPageViewController,
    viewControllerBeforeViewController ProView: UIViewController) -> UIViewController? {

    let itemController = ProView as PageItemController

        if itemController.itemIndex > 0 {
            return getItemController(itemController.itemIndex-1)
        }

        return nil
}

private func getItemController(itemIndex: Int) -> PageItemController? {

    if itemIndex < characterImages.count {
        let pageItemController = self.storyboard!.instantiateViewControllerWithIdentifier("ItemController") as PageItemController
        pageItemController.itemIndex = itemIndex
        pageItemController.imageName = characterImages[itemIndex]
        return pageItemController
}

    return nil
}

func createPageViewController() {

    let pageController = self.storyboard!.instantiateViewControllerWithIdentifier("PageController") as UIPageViewController
    pageController.dataSource = self

    if characterImages.count > 0 {
        let firstController = getItemController(0)!
        let startingViewControllers: NSArray = [firstController]
        pageController.setViewControllers(startingViewControllers, direction:     UIPageViewControllerNavigationDirection.Forward, animated: false, completion: nil)
    }

    pageViewController = pageController
    addChildViewController(pageViewController!)
    self.view.addSubview(pageViewController!.view)
    pageViewController?.didMoveToParentViewController(self)
}

func setupPageControl() {
    let appearance = UIPageControl.appearance()
    appearance.pageIndicatorTintColor = UIColor.grayColor()
    appearance.currentPageIndicatorTintColor = UIColor.whiteColor()
}

func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int {
    return characterImages.count
}

func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int {
    return 0
}

}

class PageItemController: UIViewController {

@IBOutlet weak var imageCharacterChoose: UIImageView!

var itemIndex: Int = 0
var imageName: String = "" {
    didSet {

        if let imageView = imageCharacterChoose {imageCharacterChoose.image = UIImage(named: imageName)
        }

    }
}

override func viewDidLoad() {
    super.viewDidLoad()

    imageCharacterChoose!.image = UIImage(named: imageName)

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

}

我想知道用户是否正确地从一个视图滑动到另一个视图。就此而言,我需要方法 transitionCompleted 才能工作:

func pageViewController(ProView: UIPageViewController,
    didFinishAnimating finished: Bool,
    previousViewControllers pageViewController: [AnyObject],
    transitionCompleted completed: Bool)
{
// If the page did not turn
if (!completed)
{
// You do nothing because whatever page you thought
// the book was on before the gesture started is still the correct page
println("The page number did not change.")
return;
}

// This is where you would know the page number changed and handle it appropriately
println("The page number has changed.")
}

问题是这不起作用(控制台输出不打印任何内容),因为参数可能不正确。根据 Apple Reference,

pageViewController 页面视图控制器。 previousViewControllers 转换之前的视图控制器。

因此,我使用 "ProView" 和 "pageViewController" 更改了参数,但这似乎不起作用。 根据 transitionCompleted 方法的代码,正确的参数是什么? 我需要声明什么吗?

问题是 pageViewController:didFinishAnimating:... 是一个委托方法,但是这个 class 不是页面视图控制器的委托。

你有这条线:

pageController.dataSource = self

所以你正在设置 dataSource。但是你从来没有设置 delegate。设置它:

pageController.delegate = self