UIPageViewController的第二页和第三页闪烁为白色

时间:2017-09-11 07:51:12

标签: ios swift uipageviewcontroller

我有一个pageviewcontroller,但是当我滑到第二页时,它显示正确的控制器一瞬间,然后屏幕变白,如果我再刷一下它会显示为应该是。它还有4页而不是我想要的3页。

以下是展示问题的视频:https://streamable.com/i1inq

索引如下:

 profileController.index = 0
 discoverController.index = 1
 matchController.index = 2

func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController?
{
    if index == 0
    {
        index = discoverController.index
        return discoverController
    }
    else if index == 1
    {
        index = matchController.index
        return matchController
    }

    return nil
}

编辑:我还应该提到初始控制器是profileController,因此当应用程序运行时索引从0开始。

2 个答案:

答案 0 :(得分:9)

<强>更新

您可以使用index属性修改代码自定义viewcontroller:

func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController?
{
    let index = (viewController as? MyCustomVCWithIndexForPageViewController).index
    if index == 0
    {
        index = discoverController.index
        return discoverController
    }
    else if index == 1
    {
        index = matchController.index
        return matchController
    }

    return nil
}

<强>原始

您不应该缓存与pageviewcontroller相关的参数。 UIPageViewController有时preload您的网页可以获得更好的效果。

前:

您有3页要显示。

您现在正在显示第一页首页。

然后滚动到第二个视图。使用viewControllerAfter第一个viewcontroller调用viewController来请求第二个viewcontroller。

viewControllerAfter再次使用viewController第二个viewcontroller调用,请求第三个viewcontroller(preload)。

在这种情况下,如果您缓存索引,则会导致不可预测的结果。

答案 1 :(得分:4)

您没有提供足够的代码来检测导致问题的原因。但这就是我通常使用UIPageController的方式

class ViewController: UIViewController {

    var pages = [UIViewController]()
    override func viewDidLoad() {
        super.viewDidLoad()
        // add pages to the array
        // ...
    }
}

extension ViewController: UIPageViewControllerDataSource {

    func pageViewController(_ pageViewController: UIPageViewController,
                            viewControllerAfter viewController: UIViewController) -> UIViewController? {
        // find index of viewcontroller in array
        if let index = pages.index(of: viewController) {
            switch index {
                // if index is last item you should return first item
            case pages.count - 1:
                return pages[0]
            default:
                // by default return next item in array
                return pages[index + 1]
            }
        }
        return nil
    }

    func pageViewController(_ pageViewController: UIPageViewController,
                            viewControllerBefore viewController: UIViewController) -> UIViewController? {
        // find index of viewcontroller in array
        if let index = pages.index(of: viewController) {
            switch index {
                // if index is 0 you should return last item in array
            case 0:
                return pages[pages.count - 1]
            default:
                // by default return previous item in array
                return pages[index - 1]
            }
        }
        return nil
    }
}
相关问题