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

UIPageViewController second and third page flickers to white

我有一个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 开始。

已更新

您可以简单地修改您自定义的代码 viewcontroller 为 index 属性:

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
}

原创

您不应缓存与页面相关的参数viewcontroller。 UIPageViewController 有时 preload 您的页面会有更好的性能。

例如:

您有 3 个页面要显示。

您现在显示的是首页首字母。

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

并且 viewControllerAfter 再次调用 viewController 第二个 viewcontroller 请求第三个 viewcontroller (预加载)。

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

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

的方式
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
    }
}