2

我有一个UIPageViewController和一个类,它符合UIPageViewControllerDataSource并管理 UIPageViewController 显示的 UIViewControllers。当用户启动翻页时,这一切都运行良好。但现在我想以编程方式做到这一点。

我发现这里有一个非常相似的问题,它回答了静态数量的 ViewControllers 的问题:是否可以在 UIPageViewController 中以编程方式翻页?

但我无法调整使用 UIPageViewControllerDataSource 的答案。我在想一定有类似的东西:

- (void)setCurrentViewController:(UIViewController *)viewController

我想我只是在这里忽略了一些东西。

4

3 回答 3

9

答案()中提到的方法setViewControllers:direction:animated:completion:设置了当前的视图控制器,正是你所需要的。使用第一个参数定义要显示的视图控制器。如果您没有书脊,请使用一个,如果您的书是左/右,请使用两个。

于 2012-08-13T16:26:29.790 回答
2

老问题,但以下实现调用委托和数据源方法来转到上一页或下一页(但不检查是否设置了委托或数据源):

- (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];
    }];
}
于 2015-02-04T23:12:44.583 回答
1

我创建了一个具有该功能的简单项目:

https://github.com/delarcomarta/AMPageViewController

希望这可以帮到你。

于 2015-10-14T10:41:44.127 回答