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