У меня есть один ViewController, который содержит кнопку и два представления изображений, которые я хотел бы оставить навсегда, и PageViewController, который пролистывает три других ViewController, и все это работает хорошо, однако я не могу понять, как это сделать как перейти к следующему слайду программно при нажатии кнопки.
Вот как выглядит мой класс PageController (на основе очень полезного ответа Фатти здесь: UIPageViewController и раскадровка ):
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'
с селектором (я не уверен, как вызвать функцию).
Inside 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)
}
Есть идеи?