2014-10-14 4 views
0

Я пытаюсь добавить UIPageViewController в свой RootViewController в коде. Я удалил файл раскадровки в соответствии с Xcode 5 without Storyboard and ARC и добавив «обычный» ViewController отлично работает. Я adoped методы согласно UIPageViewControllerDataSourceДобавить несколько пользовательских UIViewControllers в UIPageViewController

Кроме того, я попытался упростить логику (вместо реализации ModelController от исходного проекта с просмотрами страниц, я добавляю showVCWithIndex:. Способ выбрать 1 из 3 VC от vcArray и записать его на Мутабельном массив с 1 VC Надеюсь, что вы может сказать мне, если я правильно или неправильно об этом.

.m

#import "RootPageViewController.h" 
#import "ViewController0.h" 
#import "ViewController1.h" 
#import "ViewController2.h" 

@interface RootPageViewController() 

@property (strong, nonatomic) ViewController0 *vController0; 
@property (strong, nonatomic) ViewController1 *vController1; 
@property (strong, nonatomic) ViewController2 *vController2; 

@property (strong, nonatomic) UIPageViewController *pageViewController; 

@property (strong, nonatomic) NSArray *vcArray; 
@property (strong, nonatomic) NSMutableArray *viewController; 

@end 

@implementation RootPageViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil]; 

    self.pageViewController.dataSource = self; 

    _vController0 = [[ViewController0 alloc] init]; 
    _vController1 = [[ViewController1 alloc] init]; 
    _vController2 = [[ViewController2 alloc] init]; 


    NSUInteger index = 0; 
    NSMutableArray *viewController = [NSMutableArray arrayWithObjects:[self showVCWithIndex:index], nil]; 

    [self.pageViewController setViewControllers:viewController 
             direction:UIPageViewControllerNavigationDirectionForward 
             animated:NO 
            completion:nil]; 

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

    CGRect pageViewRect = self.view.bounds; 
    self.pageViewController.view.frame = pageViewRect; 

    [self.pageViewController didMoveToParentViewController:self]; 

} 

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController 
     viewControllerBeforeViewController:(UIViewController *)viewController 
{ 
    NSUInteger index = [self.vcArray indexOfObject:viewController]; 
    if ((index == 0) || (index == NSNotFound)) { 
     return nil; 
    } 

    index--; 
    return [self showVCWithIndex:index]; 
} 

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController 
     viewControllerAfterViewController:(UIViewController *)viewController 
{ 
    NSUInteger index = [self.vcArray indexOfObject:viewController]; 

    if (index == 2 || index == NSNotFound) { 
     return nil; 
    } 

    index++; 
    return [self showVCWithIndex:index]; 
} 

- (UIViewController *)showVCWithIndex: (NSUInteger)index 
{ 
    self.vcArray = [NSArray arrayWithObjects: _vController0, _vController1, _vController2, nil]; 

    UIViewController *currentVC = [self.vcArray objectAtIndex:index]; 

    return currentVC; 
} 

@end 

EDIT получил решение (этот код работает, но я не уверен, если я на 100% право)

ответ

0

Когда вы звоните ...

[self.pageViewController setViewControllers:[vcArray objectAtIndex:0] 
            direction:UIPageViewControllerNavigationDirectionForward 
            animated:NO 
           completion:nil]; 

... вы настраиваете контроллер nil вида на контроллер представления нумерации страниц.

[vcArray objectAtIndex:0] указывает на _vController0, который в этот момент nil (вы еще не создали его экземпляр).

Перед тем, как установить контроллеры в виде разбиения на страницы, вы должны получить их из раскадровки с помощью [self.storyboard instatiateViewControllerWithIdentifier:@"YourViewControllerIdentifier"] или просто вызвать инициализацию alloc, если вы используете Xib.

+0

Привет! Я модифицировал код и нуждаюсь в вашем опыте =) – johann

+0

Кажется, сейчас хорошо. Работало ли оно так, как ожидалось? Создание экземпляра перед добавлением в paginationVC? Если да, подумайте, примите мой ответ :) –

+0

Да, я их всех выставляю при запуске, а затем нажимаю 1 на pagingVC. Благодаря! – johann

0

Когда вы устанавливаете контроллеры вида в свой UIPageViewController, он должен быть массивом с одним контроллером. Метод -setViewControllers:direction:animated:completion: настолько вводит в заблуждение. У меня была такая же проблема, как и у вас, когда я впервые создал контроллер просмотра страниц.

Чтобы позволить контроллеру просмотра страницы отображать другие контроллеры представлений, вы возвращаете их в методах UIPageViewControllerDataSource-pageViewController:viewControllerBeforeViewController: и -pageViewController:viewControllerAfterViewController:.

+0

Hi! Я модифицировал код и нуждаюсь в вашем опыте =) – johann

Смежные вопросы