要从您的子视图控制器访问 setViewController,您需要您的子视图控制器知道它们的父 PageViewController。要做到这一点,首先要制定一个协议(我知道你说过你已经尝试过协议,但请看我的方法)。该协议将确保每个子视图控制器都有对父 PageViewController 的引用。
protocol PageObservation: class {
func getParentPageViewController(parentRef: PageViewController)
}
确保您的子视图控制器遵守 PageObservation 协议。
class Child1ViewController: UIViewController, PageObservation {
var parentPageViewController: PageViewController!
func getParentPageViewController(parentRef: PageViewController) {
parentPageViewController = parentRef
}
}
class Child2ViewController: UIViewController, PageObservation {
var parentPageViewController: PageViewController!
func getParentPageViewController(parentRef: PageViewController) {
parentPageViewController = parentRef
}
}
在您的 PageViewController 中,当您创建每个子视图控制器时,将它们转换为 PageObservation 类型并传递父 PageViewController 的引用。我使用一个名为 orderViewControllers 的数组来创建我的页面。我的 UIPageViewControllerDataSource 委托方法使用它来知道要加载哪些页面,但这与本示例无关,我只是想我会告诉你,以防你有不同的创建页面的方式。
class PageViewController: UIPageViewController {
var orderedViewControllers: [UIViewController] = []
//creating child 1
//i am using storyboard to create the child view controllers, I have given them the identifiers Child1ViewController and Child2ViewController respectively
let child1ViewController = UIStoryboard(name: "Main", bundle: nil) .
instantiateViewController(withIdentifier: "Child1ViewController")
let child1WithParent = child1ViewController as! PageObservation
child1WithParent.getParentPageViewController(parentRef: self)
orderedViewControllers.append(child1ViewController)
//creating child 2
let child2ViewController = UIStoryboard(name: "Main", bundle: nil) .
instantiateViewController(withIdentifier: "Child2ViewController")
let child2WithParent = child2ViewController as! PageObservation
child2WithParent.getParentPageViewController(parentRef: self)
orderedViewControllers.append(child2ViewController)
}
现在在您的子视图控制器中,您可以访问 setViewControllers。例如,如果我想在 child1ViewController 中调用 setViewControllers,我创建了一个名为 accessSetViewControllers() 的函数,我可以在其中访问 setViewControllers:
class Child1ViewController: UIViewController, PageObservation {
var parentPageViewController: PageViewController!
func getParentPageViewController(parentRef: PageViewController) {
parentPageViewController = parentRef
}
func accessSetViewControllers() {
parentPageViewController.setViewControllers( //do what you need )
}
}
附带说明,尽管上面的其他答案已经说过,您可以将 dataSource 设置为您喜欢的任何内容。我有时将 dataSource 设置为 nil 以防止用户在执行某项操作之前从屏幕上滑动,然后将 dataSource 添加回来以允许他们继续滑动。