3

有谁知道我为了手动将我自己的视图控制器添加到 UIPageViewController 方法而缺少什么?

我目前有这个,我不知道如何进行:

NSDictionary *pageViewOptions = [NSDictionary dictionaryWithObjectsAndKeys:UIPageViewControllerOptionSpineLocationKey, [NSNumber numberWithInteger:UIPageViewControllerSpineLocationMin], nil];

self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:pageViewOptions];


BookViewController *pageOne = [self.storyboard instantiateViewControllerWithIdentifier:@"BookViewController"];

AnotherPage *pageTwo = [self.storyboard instantiateViewControllerWithIdentifier:@"AnotherPage"];

PageThree *pageThree = [self.storyboard instantiateViewControllerWithIdentifier:@"PageThree"];


self.pageViewController.delegate = self;
self.pageViewController.dataSource = self;

[self.pageViewController setViewControllers:[NSArray arrayWithObjects:pageOne, pageTwo, pageThree, nil] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];

[self addChildViewController:self.pageViewController];

[self.view addSubview:self.pageViewController.view];

self.view.gestureRecognizers = self.pageViewController.gestureRecognizers;

[self.pageViewController didMoveToParentViewController:self];

但这似乎不起作用。我只看到 RootViewController。

感谢所有喜欢帮助像我这样热心的新手的人,提前.... :)

4

3 回答 3

7

您设置它的方式并不完全UIPageViewController有效。

首先要了解的是setViewControllers:direction:animated:completion只设置可见视图控制器,而不是您可能希望向用户显示的所有视图控制器。(也就是说,如果我尝试在您的代码中设置一个包含三个控制器的数组,则会出现异常。)

其次,如果您有多个可见页面(或两个,取决于书脊位置),您必须实现UIPageViewControllerDataSource协议以提供页面视图控制器将显示的视图控制器。

这是一个简短的示例(作为 的子类实现UIPageViewController,但也可以与子页面视图控制器一起使用......只需替换self.dataSource = ...myPageViewController.dataSource = ...

@implementation MyPageViewController {
    // we keep our page view controllers in an array, but we could just as easily
    // instantiate them on the fly in the data source methods
    NSArray *_pages;
}

- (void)setupPages {
    /*
     * set up three pages, each with a different background color
     */
    UIViewController *a = [[UIViewController alloc] initWithNibName:nil bundle:nil];
    a.view.backgroundColor = [UIColor redColor];
    UIViewController *b = [[UIViewController alloc] initWithNibName:nil bundle:nil];
    b.view.backgroundColor = [UIColor greenColor];
    UIViewController *c = [[UIViewController alloc] initWithNibName:nil bundle:nil];
    c.view.backgroundColor = [UIColor blueColor];
    _pages = @[a, b, c];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    [self setupPages];
    self.dataSource = self;
    // set the initially visible page's view controller... if you don't do this
    // you won't see anything.
    [self setViewControllers:@[_pages[0]] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:^(BOOL finished) {
    }];
}

#pragma mark - UIPageViewControllerDataSource

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController {
    if (nil == viewController) {
        return _pages[0];
    }
    NSInteger idx = [_pages indexOfObject:viewController];
    NSParameterAssert(idx != NSNotFound);
    if (idx >= [_pages count] - 1) {
        // we're at the end of the _pages array
        return nil;
    }
    // return the next page's view controller
    return _pages[idx + 1];
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController {
    if (nil == viewController) {
        return _pages[0];
    }
    NSInteger idx = [_pages indexOfObject:viewController];
    NSParameterAssert(idx != NSNotFound);
    if (idx <= 0) {
        // we're at the end of the _pages array
        return nil;
    }
    // return the previous page's view controller
    return _pages[idx - 1];
}
于 2013-07-09T22:42:08.470 回答
0

我在这里看到了一些问题。我自己有点菜鸟,所以我不知道这是否会解决您代码中的所有问题。

  1. 您需要一个 UIPageViewController,然后需要在需要时实例化的各个页面的视图。传递视图数组效率不高(使用太多内存)。

  2. 您需要在从 UIPageViewController 子类的类中实现 UIPageViewControllerDataSource 协议。您的代码段中的大部分(但不是全部)代码都将放在此处。有关说明,请参阅类参考本教程

  3. 您可能比手势识别器需要做的工作更多。如果您使用 IBOutlet,您可以通过界面生成器进行管道连接。

希望这可以帮助。

于 2011-12-06T03:22:10.900 回答
0

试试这个功能:

setViewControllers:direction:animated:completion:

设置要显示的视图控制器。

- (void)setViewControllers:(NSArray *)viewControllers direction:(UIPageViewControllerNavigationDirection)direction animated:(BOOL)animated completion:(void (^)(BOOL finished))completion

参数

viewControllers:要显示的视图控制器或视图控制器。

方向:导航方向。

动画:一个布尔值,指示是否要对过渡进行动画处理。

完成:当翻页动画完成时要调用的块。

该块采用以下参数:

完成 YES 如果动画完成;否,如果它被跳过。

于 2012-06-29T07:30:13.497 回答