Swift 中的 PageViewController,索引一直评估为 nil

PageViewController in Swift, index keeps evaluating to nil

我学习了关于使用 Storyboard 制作 UIPageViewController 的最流行的在线教程之一 (http://www.appcoda.com/uipageviewcontroller-storyboard-tutorial/),并尝试将其转换为 Swift。

不出所料,我遇到了一些问题。

这是我的代码:

PageContentViewController.swift

import UIKit

class PageContentViewController: UIViewController {

@IBOutlet weak var backgroundImageView: UIImageView!
@IBOutlet weak var titleLabel: UILabel!
var pageIndex:Int!
var titleText:String!
var imageFile:String!


override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
    self.backgroundImageView.image = UIImage(named: self.imageFile)
    self.titleLabel.text = self.titleText

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

ViewController.swift

 import UIKit

class ViewController: UIViewController, UIPageViewControllerDataSource {

@IBAction func startWalkthrough(sender: AnyObject) {
}
var pageViewController:UIPageViewController!
var pageTitles:Array<String>!
var pageImages:Array<String>!
override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    self.pageTitles = ["Over 200 Tips and Tricks", "Discover Hidden Features", "Bookmark Favorite Tip", "Free Regular Update"]
    self.pageImages = ["page1.png", "page2.png", "page3.png", "page4.png"]



    // Create page view controller

    self.pageViewController = self.storyboard!.instantiateViewControllerWithIdentifier("PageViewController") as! UIPageViewController
    self.pageViewController.dataSource = self
    var startingViewController:PageContentViewController  = self.viewControllerAtIndex(0)!
    var viewControllers:Array<PageContentViewController> = [startingViewController]
    self.pageViewController.setViewControllers(viewControllers, direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: nil)

    self.pageViewController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - 30)
    self.addChildViewController(pageViewController)
    self.view.addSubview(pageViewController.view)
    self.pageViewController.didMoveToParentViewController(self)


}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


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

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


//helper method to get the index of current page

func viewControllerAtIndex(index: Int)-> PageContentViewController?{

    if((self.pageTitles.count == 0) || (index >= self.pageTitles.count))
    {
        return nil
    }

    var pageContentViewController: PageContentViewController = self.storyboard!.instantiateViewControllerWithIdentifier("PageContentViewController") as! PageContentViewController
    pageContentViewController.imageFile = self.pageImages[index]
    pageContentViewController.titleText = self.pageTitles[index]
    pageContentViewController.pageIndex = index

    return pageContentViewController

}


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

    var index: Int? = PageContentViewController().pageIndex!
    if ((index! == 0) || index! == NSNotFound)
    {
        return nil
    }
    else {
        index! = index! - 1
        println(index!)
        return viewControllerAtIndex(index!)

    }
}


func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController?{
    var index:Int? = PageContentViewController().pageIndex!

    println(index!)
    if (index! == NSNotFound)
        {
            return nil
        }

    index! = index! + 1
    if(index! == self.pageTitles.count)
        {
        return nil
        }
    println(index!)
    return viewControllerAtIndex(index!)
}


}

问题如下:

1) 当我 运行 应用程序时,它加载了第一张图片,但向右滑动会导致 运行 时间错误,这表明页面索引等于 nil。然后我尝试在 PageContentViewController

中初始化索引
var pageIndex:Int! = 0

但这不起作用。索引不再为零,但左右滑动的整个逻辑都下降了。它仅从 0 计数到 1,然后返回到 0,而不是递增到 2。

2)第二件事是我的标签和按钮不可见,好像被图片遮住了,不知道为什么

如果有人对这个索引问题有任何想法,我将不胜感激

提前致谢!

您在委托方法中使用的不是局部变量 pageViewController.pageIndex!,而是静态变量 PageContentViewController().pageIndex!。这就是 pageIndex 始终相同的原因。

以下是我的实现方式,因此您可以做类似的事情。

func viewControllerAtIndex(index: Int) -> FeaturedRecipeViewController {
    let featuredRecipeViewController = FeaturedRecipeViewController(nibName: "FeaturedRecipeViewController", bundle: nil)
    featuredRecipeViewController.pageIndex = index
    return featuredRecipeViewController
}

请注意,我正在为 ViewController 对象设置索引。

当我寻找下一个 ViewController 时,我会这样做:

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

    let index = (viewController as! FeaturedRecipeViewController).pageIndex // This is the line you are looking for

    if index == pages.count - 1 {
        index = 0
    } else {
        index++
    }
    return viewControllerAtIndex(index)
}

我更改了代码,因为它在我的情况下做了一些非常奇怪的事情,但这应该与您正在寻找的东西相似。