如何在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
答案 0 :(得分:1)
UIPageViewController
没有"保持视图控制器"在你想到的意义上。它只是显示由其dataSource
...返回的视图控制器,其dataSource
是您的代码。
如果您只是这样做:
[pageViewController setViewControllers:@[UIViewController.new] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
将替换当前的"页面"使用空的UIViewController - 但它不会做任何其他事情。您仍然可以滚动,并根据您的下一个/上一个逻辑,可能会导致其他错误。
你想要做的是"清楚"当前页面包含该行,但也阻止滚动/滑动。这通常是通过将UIPageViewController
' s dataSource
设置为零来完成的。
答案 1 :(得分:0)
如@DonMag所解释。真的您能做的就是
只需将您看到的当前VC替换为空白。
将页面视图控制器的数据源设置为空
重要警告..
•在您的应用中拥有“空白” 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")
}