Swift:从其他Viewcontroller调用PageViewController中的函数

Phi*_*gat 3 xcode delegates ios uipageviewcontroller swift

我有一个PageViewController,它加载了两个“子” ViewController,以使用户可以“滑动”它们。我不希望有这种滑动手势,但是我想在ViewController中使用一个函数,该函数允许我在PageViewController中使用setViewControllers。

我尝试使用协议,但即使这样也没有解决。

我真的很感激我能做到的任何帮助或建议。谢谢!

gwi*_*yai 6

要从子视图控制器访问setViewControllers,您将需要子视图控制器了解其父PageViewController。为此,请先制定一个协议(我知道您已经说过您尝试过协议,但是请仔细阅读我的方法)。该协议将确保每个子视图控制器都具有对父PageViewController的引用。

    protocol PageObservation: class {
        func getParentPageViewController(parentRef: PageViewController)
    }
Run Code Online (Sandbox Code Playgroud)

确保您的子视图控制器遵守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
        }
    }
Run Code Online (Sandbox Code Playgroud)

在您的PageViewController中,当您创建每个子视图控制器时,将它们强制转换为PageObservation类型,并传递父级PageViewController的引用。我使用名为orderViewControllers的数组创建页面。我的UIPageViewControllerDataData委托方法使用它来知道要加载哪些页面,但这与本示例无关,我只是想让您知道,以防您使用其他方式来创建页面。

    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)
    }
Run Code Online (Sandbox Code Playgroud)

现在,在子视图控制器中,您可以访问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 )
        }
    }
Run Code Online (Sandbox Code Playgroud)

附带说明一下,尽管上面有其他答案,您仍可以将dataSource设置为您喜欢的任何内容。有时,我将dataSource设置为nil,以防止用户在做某事之前从屏幕上划开,然后再添加dataSource以允许他们继续划动。