Как добавить массив страниц в UIPageViewController в iOS 5? - PullRequest
3 голосов
/ 15 ноября 2011

Кто-нибудь знает, что мне не хватает, чтобы вручную добавить свои собственные контроллеры представления в методы 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.

Спасибо всем, кто любит помогать начинающим новичкам, таким как я, заранее ....:)

Ответы [ 3 ]

7 голосов
/ 10 июля 2013

То, как вы это настроили, не совсем так, как работает 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];
}
0 голосов
/ 29 июня 2012

Попробуйте эту функцию:

setViewControllers:direction:animated:completion:

Устанавливает контроллеры представления для отображения.

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

Параметры

viewControllers: отображаемый контроллер или контроллеры представления.

направление: навигационное направление.

animated: логическое значение, которое указывает, должен ли переход быть анимированным.

завершение: блок, вызываемый при завершении анимации при переворачивании страницы.

Блок принимает следующие параметры:

закончил ДА, если анимация закончена; НЕТ, если оно было пропущено.

0 голосов
/ 06 декабря 2011

Я вижу здесь несколько проблем.Я сам немного новичок, поэтому я не знаю, исправит ли это все в вашем коде.

  1. Вам нужен UIPageViewController, а затем просмотр отдельных страниц, которыесоздается при необходимости.Передача массива представлений неэффективна (использует слишком много памяти).

  2. Вам необходимо реализовать протокол UIPageViewControllerDataSource в вашем классе, который является подклассом из UIPageViewController.Большая часть (но не весь) кода в вашем фрагменте будет здесь.См. ссылку на класс или этого руководства для объяснения.

  3. Вероятно, вы выполняете больше работы, чем нужно, с помощью распознавателей жестов.Если вы используете IBOutlet, вы можете выполнить подключение через конструктор интерфейса.

Надеюсь, это поможет.

...