Swift:如何以编程方式推进容器视图内的 UIPageViewController?
Swift: How to programatically advance a UIPageViewController that is inside a Container View?
我有一个 ViewController,其中包含一个按钮和两个我想永久保留的图像视图,还有一个页面ViewController,它可以在其他三个 ViewController 中滑动,并且这一切都很好,但是我不知道该怎么做是如何在按下按钮时以编程方式转到下一张幻灯片。
这是我的 PageController class 的样子(基于 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 中的一个动作,包含所有这些(单独的文件)。
我尝试使用 notification/observer 但出现错误
Type 'UIPageViewController' has no member 'advancePage'
使用选择器(我不确定如何调用该函数)。
在 viewDidLoad 内部:
NotificationCenter.default.addObserver(self, selector: #selector(UIPageViewController.advancePage()), name: advance, object: nil)
UIPage 内部ViewControllerClass
func advancePage(){
setViewControllers(pages,
direction: UIPageViewController.NavigationDirection.forward,
animated: true,
completion: nil)
}
有什么想法吗?
您需要将其添加到 PageController
的 viewDidLoad
中
NotificationCenter.default.addObserver(self, selector: #selector(self.advancePage), name: advance, object: nil)
@objc func advancePage(_ note:NSNotification){
我有一个 ViewController,其中包含一个按钮和两个我想永久保留的图像视图,还有一个页面ViewController,它可以在其他三个 ViewController 中滑动,并且这一切都很好,但是我不知道该怎么做是如何在按下按钮时以编程方式转到下一张幻灯片。
这是我的 PageController class 的样子(基于 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 中的一个动作,包含所有这些(单独的文件)。
我尝试使用 notification/observer 但出现错误
Type 'UIPageViewController' has no member 'advancePage'
使用选择器(我不确定如何调用该函数)。
在 viewDidLoad 内部:
NotificationCenter.default.addObserver(self, selector: #selector(UIPageViewController.advancePage()), name: advance, object: nil)
UIPage 内部ViewControllerClass
func advancePage(){
setViewControllers(pages,
direction: UIPageViewController.NavigationDirection.forward,
animated: true,
completion: nil)
}
有什么想法吗?
您需要将其添加到 PageController
的 viewDidLoad
NotificationCenter.default.addObserver(self, selector: #selector(self.advancePage), name: advance, object: nil)
@objc func advancePage(_ note:NSNotification){