Swift:如何以编程方式推进容器视图中的UIPageViewController?

问题描述 投票:2回答:1

我有一个ViewController包含一个按钮和两个图像视图,我想永久保留,一个PageViewController刷过其他三个ViewControllers,这一切都运行良好,但我无法弄清楚怎么做是如何按下按钮时以编程方式转到下一张幻灯片。

这是我的PageController类的样子(基于Fattie在这里非常有用的答案:UIPageViewController and storyboard):

class PageController: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {


var pages = [UIViewController]()

override func viewDidLoad() {
    super.viewDidLoad()

    self.delegate = self
    self.dataSource = self

    let p1: UIViewController! = storyboard?.instantiateViewController(withIdentifier: "onboardingText01")
    let p2: UIViewController! = storyboard?.instantiateViewController(withIdentifier: "onboardingText02")
    let p3: UIViewController! = storyboard?.instantiateViewController(withIdentifier: "onboardingText03")

    pages.append(p1)
    pages.append(p2)
    pages.append(p3)

    setViewControllers([p1], direction: UIPageViewController.NavigationDirection.forward, animated: false, completion: nil)

}


func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController)-> UIViewController? {

    let currentPage = pages.index(of: viewController)!

    // used to prevent the PageViewController from looping
    if currentPage == 0 { return nil }

    let prev = abs((currentPage - 1) % pages.count)
    return pages[prev]

}

func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController)-> UIViewController? {

    let currentPage = pages.index(of: viewController)!

    // used to prevent the PageViewController from looping
    if currentPage == (pages.count - 1) { return nil }

    let nxt = abs((currentPage + 1) % pages.count)
    return pages[nxt]
}

func presentationIndex(for pageViewController: UIPageViewController)-> Int {
    return pages.count
}

}

然后将该按钮定义为ViewController中包含所有这些(单独文件)的操作。

我尝试使用通知/观察者但我收到错误

类型'UIPageViewController'没有成员'advancePage'

选择器(我不知道如何调用该函数)。

里面的viewDidLoad:

NotificationCenter.default.addObserver(self, selector: #selector(UIPageViewController.advancePage()), name: advance, object: nil)

在UIPageViewController类中

    func advancePage(){
        setViewControllers(pages,
                           direction: UIPageViewController.NavigationDirection.forward,
                           animated: true,
                           completion: nil)
    }

有任何想法吗?

ios swift uipageviewcontroller uicontainerview
1个回答
1
投票

你需要在PageControllerviewDidLoad里面加上这个

NotificationCenter.default.addObserver(self, selector: #selector(self.advancePage), name: advance, object: nil)

@objc func advancePage(_ note:NSNotification){
© www.soinside.com 2019 - 2024. All rights reserved.