// Set visible view controllers, optionally with animation. Array should only include view controllers that will be visible after the animation has completed.
// For transition style 'UIPageViewControllerTransitionStylePageCurl', if 'doubleSided' is 'YES' and the spine location is not 'UIPageViewControllerSpineLocationMid', two view controllers must be included, as the latter view controller is used as the back.
- (void)setViewControllers:(nullable NSArray<UIViewController *> *)viewControllers direction:(UIPageViewControllerNavigationDirection)direction animated:(BOOL)animated completion:(void (^ __nullable)(BOOL finished))completion;
First of all, setViewControllers:direction:animated:completion: is for you to set all the view controllers that will be visible after the animation has finished: sending that an array that consists solely of a freshly allocated UIPageViewController means that the original pageViewController object will just be showing a brand new UIPageViewController and no content view controllers, which I'm pretty sure is very bad and really not what you intended.
The array should consist of whichever view controllers you want to be showing next.
Secondly, is your UIPageViewController set with a page transition style of UIPageViewControllerTransitionStyleScroll?
If so, there is indeed a bug in UIKit that sometimes causes this exception; I *think* it can be prevented by making sure you don't initiate a second call to setViewControllers:direction:animated:completion: until the first has completed, but I've yet to test the theory.