iOS Swift: UIPageViewController - Turning page programmatically
The Swift 3 version of SuitedSloth's answer (with a small tweak to the animated
parameter as I needed it to be animated by default, but still taking a parameter in the function) in case anyone needs it:
extension UIPageViewController {
func goToNextPage(animated: Bool = true) {
guard let currentViewController = self.viewControllers?.first else { return }
guard let nextViewController = dataSource?.pageViewController(self, viewControllerAfter: currentViewController) else { return }
setViewControllers([nextViewController], direction: .forward, animated: animated, completion: nil)
}
func goToPreviousPage(animated: Bool = true) {
guard let currentViewController = self.viewControllers?.first else { return }
guard let previousViewController = dataSource?.pageViewController(self, viewControllerBefore: currentViewController) else { return }
setViewControllers([previousViewController], direction: .reverse, animated: animated, completion: nil)
}
}
There's generally no need to fiddle around with page indexes and what not. Chances are you are already implementing a dataSource: UIPageViewControllerDataSource
, which has all of what you need to get a previous or next ViewController to display.
Swift 5 Example:
extension UIPageViewController {
func goToNextPage() {
guard let currentViewController = self.viewControllers?.first else { return }
guard let nextViewController = dataSource?.pageViewController( self, viewControllerAfter: currentViewController ) else { return }
setViewControllers([nextViewController], direction: .forward, animated: false, completion: nil)
}
func goToPreviousPage() {
guard let currentViewController = self.viewControllers?.first else { return }
guard let previousViewController = dataSource?.pageViewController( self, viewControllerBefore: currentViewController ) else { return }
setViewControllers([previousViewController], direction: .reverse, animated: false, completion: nil)
}
}
This way you're guaranteed that the pages you're transitioning to are exactly what the PageViewController's
built in gestures would trigger.