清空UIPageViewController(删除里面的ViewControllers)

时间:2017-05-15 13:09:07

标签: ios objective-c swift

如何在Swift中删除UIPageViewController中的所有viewControllers?

那些电话:

pageViewController.setViewControllers(nil,....)
pageViewController.setViewControllers([UIViewController(),....)

使我的应用程序崩溃并显示以下消息:The number of view controllers provided (0) doesn't match the number required (1) for the requested transition

2 个答案:

答案 0 :(得分:1)

UIPageViewController没有"保持视图控制器"在你想到的意义上。它只是显示由其dataSource ...返回的视图控制器,其dataSource您的代码。

如果您只是这样做:

[pageViewController setViewControllers:@[UIViewController.new] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];

替换当前的"页面"使用空的UIViewController - 但它不会做任何其他事情。您仍然可以滚动,并根据您的下一个/上一个逻辑,可能会导致其他错误。

你想要做的是"清楚"当前页面包含该行,但阻止滚动/滑动。这通常是通过将UIPageViewController' s dataSource设置为零来完成的。

答案 1 :(得分:0)

唐对2020年的解释:

如@DonMag所解释。真的您能做的就是

  1. 只需将您看到的当前VC替换为空白。

  2. 将页面视图控制器的数据源设置为空

重要警告..

•在您的应用中拥有“空白” VC的真正含义是什么?可能是,您使用了特殊的视图控制器(只是“灰云”或“没有数据的解释”之类的东西)。

•但实际上您可以放心地使用UIViewController(),它将为空白,一无所有。

•对于第2点,别忘了将其重新设置!

在实践中...类似...

var vcs: [UIViewController] = []

func reloadPages() {
    print("reload pages in your page view controller")
    let k = yourData.count

    if k == 0 {
        dataSource = nil
        setViewControllers([UIViewController()], direction: .forward, animated: false)
        return
    }
    
    dataSource = self
    
    vcs = []
    for i in 0..<k {
        let vc = _sb("SomePageOfYours") as! SomePageOfYours
        vcs.append(vc)
    }
    
    setViewControllers([vcs[0]], direction: .forward, animated: false)
}

在代码的最后一行,请不要忘记它是仅包含第一项的数组,而不是整个数组。

此外-调用_sb只是从情节提要中加载视图控制器的东西。例子,

func _sb(_ s: String) -> UIViewController {
    // assume the storyboard id is set as ClassNameID
    return UIStoryboard(name: s, bundle: nil)
       .instantiateViewController(withIdentifier: s + "ID")
}