iOS Swift - 使用 UISegmentedControl 更改 UIPageViewController 页面

iOS Swift - Change UIPageViewController page using UISegmentedControl

我最终以这种方式将我的 segmentedController 同步到 UIPageViewController:当我在页面之间滑动时,分段控制器会更改它的段索引。我也想知道如何做相反的事情,当 segmentedController 的段被点击时,通过 segmentedController 索引更改 pageViewController 页面。这是我的代码:

class photoPageViewController: UIViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate, UINavigationControllerDelegate {


@IBOutlet var segmentedControl: UISegmentedControl!
private var pageViewController: UIPageViewController?
var controllers = [thePageViewController]()
var thePage = thePageViewController()

override func viewDidLoad() {
    super.viewDidLoad()

    createPageViewController()
    setupPageControl()
}

private func createPageViewController() {

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

    var firstController = getItemController(thePage.itemIndex)!
    var startingViewControllers: NSArray = [firstController]
        pageController.setViewControllers(startingViewControllers as [AnyObject], direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: nil)
    pageViewController = pageController
    addChildViewController(pageViewController!)
    self.view.addSubview(pageViewController!.view)
    pageViewController!.didMoveToParentViewController(self)
}

private func setupPageControl() {
    let appearance = UIPageControl.appearance()

    appearance.pageIndicatorTintColor = UIColor.grayColor()
    appearance.currentPageIndicatorTintColor = UIColor.whiteColor()
    appearance.backgroundColor = UIColor.darkGrayColor()
}

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

    let itemController = viewController as! thePageViewController

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

    return nil
}

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

    let itemController = viewController as! thePageViewController

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

    return nil
}

func getItemController(itemIndex: Int) -> UIViewController? {
    var vc: thePageViewController? = nil
    switch itemIndex {
    case 0:
        vc = self.storyboard!.instantiateViewControllerWithIdentifier("ViewController0") as! firstPhotoViewController
        vc?.itemIndex = itemIndex


    case 1:
        vc = self.storyboard!.instantiateViewControllerWithIdentifier("ViewController1") as! secondPhotoViewController
        vc?.itemIndex = itemIndex


    case 2:
        vc = self.storyboard!.instantiateViewControllerWithIdentifier("ViewController2") as! thirdPhotoViewController
        vc?.itemIndex = itemIndex

    default:
        return nil

    }
    return vc
}

func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int {
    return 3
}

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

func pageViewController(photoPageViewController: UIPageViewController,
    didFinishAnimating finished: Bool,
    previousViewControllers pageViewController: [AnyObject],
    transitionCompleted completed: Bool)
{
    if (!completed)
    {

        return;
    }

    segmentedControl.selectedSegmentIndex = thePageIndex 
//thePageIndex is a global variable that changes when views from pageViewController appear

}

@IBAction func segmentedFunction(sender: AnyObject) {

    switch segmentedControl.selectedSegmentIndex
    {

    case 0:
        getItemController(0)


    case 1:
        getItemController(1)

    case 2:
        getItemController(2)

    default:
        println("...")
    }

}}   

我认为您需要稍微更改一下代码!在我的例子中,我创建了几个 vc 并将它们放在一个数组中。

func createArrayOfControllers(){

    newsLenta = self.storyboard?.instantiateViewControllerWithIdentifier("NewsLentaTableViewController") as NewsLentaTableViewController
    mainPage = self.storyboard?.instantiateViewControllerWithIdentifier("MainPageTableViewController") as MainPageTableViewController
    onlinetranslation = self.storyboard?.instantiateViewControllerWithIdentifier("SingleTopicTableViewController") as SingleTopicTableViewController

    tableViewControllers = [newsLenta, mainPage, onlinetranslation]
}

哪里tableViewController is global var var tableViewControllers = [UITableViewController]()!我签署了 TableViewController 类型,因为我所有的 vs 都是 table 视图控制器的类型。所以您需要更改的下一个函数是

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

        if index > 2 || index < 0 {
            return nil
        }
  return tableViewControllers[index]
    }

最后你只需要创建 segmentControl 的动作并通过索引重置你的 vc。使用此功能:

func resetToMainPage(index: Int!) {
    /* Getting the page View controller */
    mainPageViewController = self.storyboard?.instantiateViewControllerWithIdentifier("MainPageViewController") as UIPageViewController
    self.mainPageViewController.dataSource = self
    self.mainPageViewController.delegate = self

    let pageContentViewController = self.viewControllerAtIndex(index)
    segmentedControl.selectedSegmentIndex = index
    self.mainPageViewController.setViewControllers([pageContentViewController!], direction: UIPageViewControllerNavigationDirection.Forward, animated: true, completion: nil)


    self.mainPageViewController.view.frame = CGRectMake(0, 95, self.view.frame.width, self.view.frame.height)
    self.addChildViewController(mainPageViewController)
    self.view.addSubview(mainPageViewController.view)
    self.mainPageViewController.didMoveToParentViewController(self)
}

我的问题是你如何更新 thePageIndex...我不明白...

我找到了更改 UIPageViewController 内容的方法 viewcontroller。我不知道这是对还是错,但它确实有效。这是一个代码: 把这个放到 viewdidload:

 segmentControl.addTarget(self, action: "selectPageIndexBySegmentControl", forControlEvents: UIControlEvents.ValueChanged)

将其与 viewdieload 分开: func selectPageIndexBySegmentControl(){

    switch segmentControl.selectedIndex {
    case 0:
        println("zero index were selected")
        pageContentViewController = self.viewControllerAtIndex(0)
        mainPageViewController.setViewControllers([pageContentViewController!], direction: UIPageViewControllerNavigationDirection.Forward, animated: true, completion: nil)
    case 1:
        println("first element were selected")
         pageContentViewController = self.viewControllerAtIndex(1)
        mainPageViewController.setViewControllers([pageContentViewController!], direction: UIPageViewControllerNavigationDirection.Forward, animated: true, completion: nil)
    case 2:
        println("second element were selected")
         pageContentViewController = self.viewControllerAtIndex(2)
        mainPageViewController.setViewControllers([pageContentViewController!], direction: UIPageViewControllerNavigationDirection.Forward, animated: true, completion: nil)
    default:
        break
    }

}