滚动

时间:2016-02-21 12:14:02

标签: ios swift uipageviewcontroller uipagecontrol

我有一个UIPageViewController,我放置了一个UIPageControl。这似乎在我滚动的大部分时间都有效,但有时它不会改变当前选定的页面。什么可能触发这种行为?

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

    let vc = viewController as! WalkthroughViewController

    var index = vc.pageIndex as Int

    self.pageControl.currentPage = index

    if (index == 0 || index == NSNotFound)

    {

        return nil



    }



    index--

    return self.viewControllerAtIndex(index)
}

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

    let vc = viewController as! WalkthroughViewController

    var index = vc.pageIndex as Int

    self.pageControl.currentPage = index


    if (index == NSNotFound)

    {

        return nil

    }



    index++



    if (index == self.pageTitles.count)

    {

        return nil

    }



    return self.viewControllerAtIndex(index)
}

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

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

        return WalkthroughViewController()

    }


    let pageContentViewController = storyboard!.instantiateViewControllerWithIdentifier("WalkthroughViewController") as! WalkthroughViewController
    pageContentViewController.titleText = pageTitles[index] as String
    pageContentViewController.subText = pageSubTitles[index] as String
    pageContentViewController.imageText = pageImages[index] as String
    pageContentViewController.pageIndex = index

    return pageContentViewController
}

1 个答案:

答案 0 :(得分:0)

了解UIPageViewControl的要点可能是使用int跟踪您所在的页面不起作用。永远不会工作。试图让它发挥作用会让你发疯。

鉴于视图控制器,您必须每次都通过将其与您拥有的索引进行比较来获取索引。

如果您阅读Apple示例代码,您会看到。令人困惑的是,从各方面来看,这都是较弱的Cocoa组件之一。

解决方案:让我们假设你有一个页面控件,你有5个不同的控制器正在翻阅。当框架要求控制器之前或之后,它会传递给当前控制器。您应该使用它并循环遍历您的集合中的当前索引,然后简单地添加或减去一个(之前/之后)并在该索引处返回控制器。那很简单。

它以这种方式完成的部分原因是您可能不希望每个页面都有不同的控制器。例如,你可能拥有相同的控制器,你只是坚持不同的东西。在这种情况下,您可以继续在单个组件中更改子组件,然后在更改其内容后返回相同的组件。