2016-08-15 95 views
0

我是使用UIPageViewController的新手,無法在Objective-C中找到很好的解釋。我試着自己實現一個,但它只在啓動時顯示黑屏。我究竟做錯了什麼?UIPageView實現黑屏

我有一個ViewController在IB中設置,它是初始的ViewController,還有兩個其中有兩個故事板ID在下面,只是坐在那裏,沒有連接任何東西。

這裏是我的初始視圖控制器代碼:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

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

    UIViewController *vc1 = [self.storyboard instantiateViewControllerWithIdentifier:@"vc1"]; 
    UIViewController *vc2 = [self.storyboard instantiateViewControllerWithIdentifier:@"vc2"]; 

    viewControllers = [[NSArray alloc] initWithObjects:vc1,vc2, nil]; 

    [self.pageViewController setViewControllers:@[vc1] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil]; 

} 

-(UIViewController *)viewControllerAtIndex:(NSUInteger)index 
{ 
    return viewControllers[index]; 
} 

-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController 
    viewControllerBeforeViewController:(UIViewController *)viewController 
{ 
    NSUInteger currentIndex = [viewControllers indexOfObject:viewController]; 

    --currentIndex; 
    currentIndex = currentIndex % (viewControllers.count); 
    return [viewControllers objectAtIndex:currentIndex]; 
} 

-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController 
     viewControllerAfterViewController:(UIViewController *)viewController 
{ 
    NSUInteger currentIndex = [viewControllers indexOfObject:viewController]; 

    ++currentIndex; 
    currentIndex = currentIndex % (viewControllers.count); 
    return [viewControllers objectAtIndex:currentIndex]; 
} 

-(NSInteger)presentationCountForPageViewController: 
(UIPageViewController *)pageViewController 
{ 
    return viewControllers.count; 
} 

-(NSInteger)presentationIndexForPageViewController: 
(UIPageViewController *)pageViewController 
{ 
    return 0; 
} 
+0

您可以檢查了這一點。 – Ro4ch

+1

我看不到你已經添加你的pageViewController到屏幕的點 –

+0

它在這裏:[self addChildViewController:self.pageViewController]; –

回答

0

你缺少

addSubview

在這之後,你應該叫

didMoveToParentViewCon troller

在子視圖控制器上獲取生命週期事件。也許https://github.com/mindsnacks/MSPageViewController,這將有助於 -

@interface ViewController()<UIPageViewControllerDelegate, UIPageViewControllerDataSource> 
@property (nonatomic, strong) UIPageViewController* pageViewController; 
@property (nonatomic,strong) NSArray *viewControllers; 
@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil]; 
    [self addChildViewController:self.pageViewController]; 
    [self.view addSubview:self.pageViewController.view]; 
    [self.pageViewController didMoveToParentViewController:self]; 
    self.pageViewController.delegate = self; 
    self.pageViewController.dataSource = self; 

    UIViewController *vc1 = [[UIViewController alloc] init]; 
    vc1.view.backgroundColor = [UIColor blueColor]; 
    UIViewController *vc2 = [[UIViewController alloc] init]; 
    vc2.view.backgroundColor = [UIColor redColor]; 

    self.viewControllers = [[NSArray alloc] initWithObjects:vc1,vc2, nil]; 

    [self.pageViewController setViewControllers:@[vc1] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil]; 

} 

-(UIViewController *)viewControllerAtIndex:(NSUInteger)index 
{ 
    return self.viewControllers[index]; 
} 

-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController 
    viewControllerBeforeViewController:(UIViewController *)viewController 
{ 
    NSUInteger currentIndex = [self.viewControllers indexOfObject:viewController]; 

    --currentIndex; 
    currentIndex = currentIndex % (self.viewControllers.count); 
    return [self.viewControllers objectAtIndex:currentIndex]; 
} 

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

    ++currentIndex; 
    currentIndex = currentIndex % (self.viewControllers.count); 
    return [self.viewControllers objectAtIndex:currentIndex]; 
} 

-(NSInteger)presentationCountForPageViewController: 
(UIPageViewController *)pageViewController 
{ 
    return self.viewControllers.count; 
} 

-(NSInteger)presentationIndexForPageViewController: 
(UIPageViewController *)pageViewController 
{ 
    return 0; 
} 
@end 
+0

@BalázsVincze你試過我的回答嗎? – MCMatan

0
- (void)viewDidLoad { 
    [super viewDidLoad]; 


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

    self.pageController.dataSource = self; 
    self.pageController.delegate = self; 

    [NSTimer scheduledTimerWithTimeInterval:5.0 
            target:self 
            selector:@selector(loadNextController) 
            userInfo:nil 
            repeats:YES]; 


    [[self.pageController view] setFrame:[[self sliderView] bounds]]; 

    self.pageControl.numberOfPages = 5; 
    self.pageControl.currentPage = 0; 

    PageChildVC *initialViewController = [self viewControllerAtIndex:0]; 

    NSArray *viewControllers = [NSArray arrayWithObject:initialViewController]; 

    [self.pageController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil]; 

    [self addChildViewController:self.pageController]; 
    [[self sliderView] addSubview:[self.pageController view]]; 
    [self.pageController didMoveToParentViewController:self]; 
} 


- (PageChildVC *)viewControllerAtIndex:(NSUInteger)index { 
    if ((5 == 0) || (index >= 5)) { 
     return nil; 
    } 
    PageChildVC *childViewController = [[PageChildVC alloc] initWithNibName:@"PageChildVC" bundle:nil]; 
    childViewController.index = index; 
    return childViewController; 

} 
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { 
    NSUInteger index = ((PageChildVC*) viewController).index; 
    if ((index == 0) || (index == NSNotFound)) { 
     index = 5; 
    } 
    index--; 
    return [self viewControllerAtIndex:index]; 
    } 
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { 
    NSUInteger index = ((PageChildVC*) viewController).index; 
    if (index == NSNotFound) { 
     return nil; 
    } 
    index++; 
    if (index == 5) { 
     index = 0; 
    } 
    return [self viewControllerAtIndex:index]; 
    } 
- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController { 
    return 5; 
} 
- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController { 
    return [(PageChildVC *)[self.pageController.viewControllers firstObject] index]; 
} 
- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed 
{ 
    PageChildVC *currentViewController = pageViewController.viewControllers[0]; 
    currentIndex = (int)currentViewController.index; 
    [self.pageControl setCurrentPage:currentIndex]; 
} 
- (void)loadNextController { 
    currentIndex++; 
    PageChildVC *nextViewController = [self viewControllerAtIndex:currentIndex]; 
    if (nextViewController == nil) { 
     currentIndex = 0; 
     nextViewController = [self viewControllerAtIndex:currentIndex]; 
    } 
    [self.pageController setViewControllers:@[nextViewController] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil]; 
    [self.pageControl setCurrentPage:currentIndex]; 
}