使用UIPageViewControllerDataSource时,在UIPageViewController中以编程方式翻页?
我有一个UIPageViewController
和一个符合UIPageViewController
的类,并管理UIPageViewController显示的UIViewControllers。 当用户启动翻页时,一切运行良好。 但现在我想以编程方式做到这一点。
我发现在SO上有一个非常类似的问题,它回答了静态数量的ViewControllers的问题: 是否可以在UIPageViewController中以编程方式翻页?
但是我无法调整UIPageViewControllerDataSource的使用答案。 我以为必须有这样的东西:
- (void)setCurrentViewController:(UIViewController *)viewController
我想我只是在这里忽略了一些东西。
答案中提到的方法( setViewControllers:direction:animated:completion:
设置当前视图控制器,正是您所需要的。 使用第一个参数定义视图控制器,您想要显示。 如果您没有书脊,请使用一个,如果您预订左/右使用两个。
旧问题,但以下实现调用委托和dataSource方法转向上一页或下一页(但不检查是否设置了delegate或dataSource):
- (IBAction)navigateReverse:(id)sender { UIViewController *controller = [self.dataSource pageViewController:self viewControllerBeforeViewController:self.designViewControllers[self.currentIndex]]; if (!controller) { return; } NSArray *newViewControllers = @[controller]; NSArray *previousViewControllers = self.viewControllers; __weak __typeof(self) weakSelf = self; [self.delegate pageViewController:self willTransitionToViewControllers:newViewControllers]; [self setViewControllers:newViewControllers direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:^(BOOL finished) { [weakSelf.delegate pageViewController:weakSelf didFinishAnimating:finished previousViewControllers:previousViewControllers transitionCompleted:finished]; }]; } - (IBAction)navigateForward:(id)sender { UIViewController *controller = [self.dataSource pageViewController:self viewControllerAfterViewController:self.designViewControllers[self.currentIndex]]; if (!controller) { return; } NSArray *newViewControllers = @[controller]; NSArray *previousViewControllers = self.viewControllers; __weak __typeof(self) weakSelf = self; [self.delegate pageViewController:self willTransitionToViewControllers:newViewControllers]; [self setViewControllers:newViewControllers direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:^(BOOL finished) { [weakSelf.delegate pageViewController:weakSelf didFinishAnimating:finished previousViewControllers:previousViewControllers transitionCompleted:finished]; }]; }