iOS Swift - 使用 UISegmentedControl 更改 UIPageViewController 页面

标签 ios swift uisegmentedcontrol uipageviewcontroller

我最终以这种方式将我的 segmentedController 同步到 UIPageViewController:当我在页面之间滑动时,分段 Controller 会更改它的段索引。我也想知道如何做相反的事情,当 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 是全局变量 var tableViewControllers = [UITableViewController]() !我签署了 TableViewController 类型,因为我所有的 vs 都是 TableView Controller 类型。所以你需要改变的下一个函数是

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

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

最后你只需要创建 segmentControl 的 Action 并按索引重置你的 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...我不明白...

关于iOS Swift - 使用 UISegmentedControl 更改 UIPageViewController 页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30112123/

相关文章:

swift - 如何在 watchOS 复杂功能中显示图像

iphone - iOS 将 UISegmentedControl 选择存储在 NSUserDefaults 中

ios - 使用 Alamofire - Swift 3 上传对象时如何捕获错误?

ios - NSURLConnection与ARC不接收数据

ios - 创建更好的面向对象设计

ios - UISegmentedControl 不尊重为 UIControlStateDisabled 设置的分隔图像

ios - 在不使用 alpha 的情况下使用 UISegmentedControl 在 View ios 之间切换?

ios - 当 contentSize 减小时,如何让 UIScrollView 调用 scrollViewDidScroll

ios - 将解析数据与 coredata 同步,如何确定要删除哪些对象?

Swift:实例化符合协议(protocol)的类(AnyClass)