【问题标题】:Swift: How to programatically advance a UIPageViewController that is inside a Container View?Swift:如何以编程方式推进容器视图内的 UIPageViewController?
【发布时间】:2019-08-07 11:30:06
【问题描述】:

我有一个 ViewController 包含一个按钮和两个我想永久保留的图像视图,还有一个 PageViewController 可以在其他三个 ViewController 之间滑动,这一切都很好,但是我不知道该怎么做是按下按钮时如何以编程方式转到下一张幻灯片。

这是我的 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)
    }

有什么想法吗?

【问题讨论】:

  • 克里斯蒂安,在我全面审查您的问题之前。有可能这会有所帮助 这是来自一个漂亮的列表成员的关于容器视图的完整教程! stackoverflow.com/a/23403979/294884 请特别注意关键部分“如何连接'到'子控制器......”(靠近中间)

标签: ios swift uipageviewcontroller uicontainerview


【解决方案1】:

你需要在PageControllerviewDidLoad里面添加这个

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

@objc func advancePage(_ note:NSNotification){

【讨论】:

  • 谢谢,但我试过了,我得到:'PageController' 类型的值没有成员'advancePage'
  • 编辑:我是个白痴,我按了太多次撤消并恢复到 UIPageViewController。而不是自己。
  • #selector(self.advancePage) 不是#selector(UIPageViewController.advancePage())
  • 这行得通,谢谢。按下按钮,应用程序崩溃并出现以下错误:由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“提供的视图控制器数量 (3) 与请求的转换所需的数量 (1) 不匹配”所以我假设我的功能有问题?
  • 没关系,解决方法是您建议的,所以信息都在这里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-19
  • 1970-01-01
  • 1970-01-01
  • 2016-05-05
  • 2011-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多