Search code examples
iosobjective-cuiviewuipageviewcontrolleruipagecontrol

Unable to add pageViewController to UIView


I want to add UIPageController to UIView of viewController

Here is my code but it is not working,

MyViewController contains one view which is _viewExpense there I want to add my viewcontroller.

MyViewController.m

- (void)viewDidLoad {
    [super viewDidLoad];

      PageViewControllerDashboard *pageViewController = [[UIStoryboard storyboardWithName:@"MoneyBag" bundle:nil] instantiateViewControllerWithIdentifier:@"PageViewControllerDashboard"];

      [self addChildViewController:pageViewController];
      [_viewExpense addSubview:pageViewController.view];
      [pageViewController didMoveToParentViewController:self];
}

PageViewControllerDashboard

- (void)viewDidLoad {
    [super viewDidLoad];

    _pageTitles = @[@"Over 200 Tips and Tricks", @"Discover Hidden Features", @"Bookmark Favorite Tip", @"Free Regular Update"];

    // Create page view controller
    self.pageViewController.dataSource = self;

    pageContentViewController *startingViewController = [self viewControllerAtIndex:0];
    NSArray *viewControllers = @[startingViewController];
    [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];

    // Change the size of page view controller
    self.pageViewController.view.frame = CGRectMake(10, 10, self.view.frame.size.width, self.view.frame.size.height - 100);


    UIPageControl *pageControl = [UIPageControl appearance];
    pageControl.pageIndicatorTintColor = [UIColor lightGrayColor];
    pageControl.currentPageIndicatorTintColor = [UIColor blackColor];
    pageControl.backgroundColor = [UIColor whiteColor];

}

Page View Controller Data Source

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
    NSUInteger index = ((pageContentViewController*) viewController).pageIndex;

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

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

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
    NSUInteger index = ((pageContentViewController*) viewController).pageIndex;

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

    index++;
    if (index == [self.pageTitles count]) {
        return nil;
    }
    return [self viewControllerAtIndex:index];
}

- (pageContentViewController *)viewControllerAtIndex:(NSUInteger)index
{
    if (([self.pageTitles count] == 0) || (index >= [self.pageTitles count])) {
        return nil;
    }

    // Create a new view controller and pass suitable data.
    pageContentViewController *pageContentViewController = [[UIStoryboard storyboardWithName:@"MoneyBag" bundle:nil] instantiateViewControllerWithIdentifier:@"pageContentViewController"];
    pageContentViewController.titleText = self.pageTitles[index];
    pageContentViewController.pageIndex = index;

    return pageContentViewController;
}

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

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

Where i am making mistake please help. Thank you in advance.


Solution

  • Well, the first mistake that I noticed is inside PageViewControllerDashboard, on this line :

    self.pageViewController.dataSource = self;
    

    You are setting dataSource property of pageViewController to self. Here your pageViewController object is expecting that all its datasource methods are declared inside PageViewControllerDashboard. Instead all the datasource methods are declared inside PageViewControllerDataSource class. So what you should do is initialize an instance of class PageViewControllerDataSource like so :

    PageViewControllerDataSource* pageViewControllerDataSource = [[PageViewControllerDataSource alloc] init]
    

    and make this instance of PageViewControllerDataSource datasource of pageViewController

    PageViewControllerDataSource* pageViewControllerDataSource = [[PageViewControllerDataSource alloc] init];
    self.pageViewController.dataSource = pageViewControllerDataSource;
    

    Once you correct the datasource property of your UIPageController instance, all datasource methods declared inside PageViewControllerDataSource will start getting called and your code should also start running as you expected.