2015-10-30 26 views
0

我正在试图在Swift中开发一个教程。我有一个页面视图控制器使用指标(http://www.appcoda.com/uipageviewcontroller-storyboard-tutorial/),但我想添加一个按钮,通过点击它来转到下一页,而不是刷屏(TODO NextPage)。如何在Swift中正确推进PageViewController

我已经试过:

let startVC = self.viewControllerAtIndex(self.index + 1) as TutorialContentViewController 
let viewControllers = NSArray(object: startVC) 
self.pageViewController.setViewControllers(viewControllers as! [UIViewController], 
    direction: UIPageViewControllerNavigationDirection.Forward, 
    animated: true, 
    completion: nil) 

的问题是,圈页面指示符没有被更新,并单击下一步之后,所有的页面都是第二页。

的源代码

import UIKit 

class TutorialViewController: UIViewController, UIPageViewControllerDataSource { 

var pageViewController: UIPageViewController! 
var pageTexts: NSArray! 
var pageImages: NSArray! 
var index: Int = 0 

@IBOutlet var button: UIButton! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.pageTexts = NSArray(objects: "Explore", "Today Widget") 
    self.pageImages = NSArray(objects: "background1.jpg", "background2.jpg") 

    self.pageViewController = self.storyboard?.instantiateViewControllerWithIdentifier("PageViewController") as! UIPageViewController 

    self.pageViewController.dataSource = self 

    let startVC = self.viewControllerAtIndex(index) as TutorialContentViewController 
    let viewControllers = NSArray(object: startVC) 

    self.pageViewController.setViewControllers(viewControllers as! [UIViewController], direction: .Forward, animated: true, completion: nil) 
    self.pageViewController.view.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.size.height - 60) 

    self.addChildViewController(self.pageViewController) 
    self.view.addSubview(self.pageViewController.view) 
    self.pageViewController.didMoveToParentViewController(self) 
} 

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

func viewControllerAtIndex(index: Int) -> TutorialContentViewController { 
    if (index >= self.pageTexts.count) { 
     return TutorialContentViewController() 
    } 

    let vc: TutorialContentViewController = self.storyboard?.instantiateViewControllerWithIdentifier("TutorialContentViewController") as! TutorialContentViewController 

    vc.image = self.pageImages[index] as! String 
    vc.text = self.pageTexts[index] as! String 
    vc.pageIndex = index 
    self.index = index 

    self.button.setTitle(self.index == self.pageTexts.count - 1 ? "Finish" : "Next", forState: .Normal) 

    return vc 
} 


// MARK: - Page View Controller Data Source 
func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { 
    let vc = viewController as! TutorialContentViewController 
    let index = vc.pageIndex as Int 

    return self.viewControllerAtIndex(index) 
} 

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

    if (index == NSNotFound) { 
     return nil 
    } 

    index++ 
    if (index == self.pageTexts.count) { 
     self.button.setTitle("Finish", forState: .Normal) 
     return nil 
    } else { 
     self.button.setTitle("Next", forState: .Normal) 
    } 
    return self.viewControllerAtIndex(index) 
} 

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

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

@IBAction func onButtonClick(sender: AnyObject) { 
    if (self.index == self.pageTexts.count - 1) { 
     let vc : UIViewController = self.storyboard!.instantiateViewControllerWithIdentifier("splashViewController") 
     vc.modalTransitionStyle = UIModalTransitionStyle.CrossDissolve 
     self.presentViewController(vc, animated: true, completion:nil) 
    } else { 
     //TODO NextPage 
    } 
} 

}

回答

1

这里let viewControllers = NSArray(object: startVC)你做的UIViewController数组只有一个UIViewController(你的第二个UIViewController)。

请使用代码中的viewControllerAtIndex函数。

所以,现在你UIButton行动应该是这样的:

func nextPage(sender: AnyObject) { 
    self.pageViewController.setViewControllers([self.viewControllerAtIndex(self.index + 1)!], direction: .Forward, animated: true, completion: nil) 
}