Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UIPageViewController - how Can I jump to a particular page number?

I have spent almost 8 hours finding out how to jump to a particular page number in UIPageViewController... below is what my project looks like

I want to make an app which looks like Ibooks---

I have taken the help from the code presented here - http://www.ioslearner.com/tag/uipageviewcontroller-sample-code/

I have made a plist and UITableView , I select the value from TableView and display the same on webView placed on UIPAgeiewController, but the problem is that only the page in web view changes and not the actual page number of the UIPageViewController....

If I narrow down my question it would look like --- is there a way to switch between page numbers in UIPageViewController.... ???

like image 738
A K Avatar asked Jul 04 '12 20:07

A K


4 Answers

You have to instantiate the view controller(s) that manage the page(s) you want to jump to and then call the page view controller's setViewControllers:direction:animated:completion: method, passing the new view controller(s).

like image 172
Ole Begemann Avatar answered Nov 12 '22 05:11

Ole Begemann


Swift Code:

func goToPage(index: Int) {
    if index < viewControllers.count {
        pageVC!.setViewControllers([viewControllers[index]], direction: .Forward, animated: true, completion: nil)
    }
}
like image 31
Cullen SUN Avatar answered Nov 12 '22 04:11

Cullen SUN


Here is another example how to jump to page with parsed Index:

-(void)gotoPage:(int)index{


    SinglePageViewController *viewController = [self viewControllerAtIndex:index];

    UIPageViewControllerNavigationDirection direction;
    if(_curIndex <= index){
        direction = UIPageViewControllerNavigationDirectionForward;
    }
    else
    {
        direction = UIPageViewControllerNavigationDirectionReverse;
    }


    if(_curIndex < index)
    {
        for (int i = 0; i <= index; i++)
        {
            if (i == index) {
                [self.pageViewController setViewControllers:@[viewController]
                                          direction:direction
                                           animated:YES
                                         completion:nil];
            }
            else
            {
                [self.pageViewController setViewControllers:@[[self viewControllerAtIndex:i]]
                                          direction:direction
                                           animated:NO
                                         completion:nil];

            }
        }
    }
    else
    {
        for (int i = _curIndex; i >= index; i--)
        {
            if (i == index) {
                [self.pageViewController setViewControllers:@[viewController]
                                          direction:direction
                                           animated:YES
                                         completion:nil];
            }
            else
            {
                [self.pageViewController setViewControllers:@[[self viewControllerAtIndex:i]]
                                          direction:direction
                                           animated:NO
                                         completion:nil];

            }
        }
    }

    _curIndex = index;
}
like image 42
Miki Avatar answered Nov 12 '22 04:11

Miki


I use this function (I'm always in landscape, 2 page mode)

-(void) flipToPage:(NSString * )index {


int x = [index intValue];
LeafletPageContentViewController *theCurrentViewController = [self.pageViewController.viewControllers   objectAtIndex:0];

NSUInteger retreivedIndex = [self indexOfViewController:theCurrentViewController];

LeafletPageContentViewController *firstViewController = [self viewControllerAtIndex:x];
LeafletPageContentViewController *secondViewController = [self viewControllerAtIndex:x+1 ];


NSArray *viewControllers = nil;

viewControllers = [NSArray arrayWithObjects:firstViewController, secondViewController, nil];


if (retreivedIndex < x){

    [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:NULL];

} else {

    if (retreivedIndex > x ){

        [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionReverse animated:YES completion:NULL];
      } 
    }
} 

Maybe you need this too

- (LeafletPageContentViewController *)viewControllerAtIndex:(NSUInteger)index {   

    if (([self.modelArray count] == 0) || (index >= [self.modelArray count])) {
        return nil;
    }
    LeafletPageContentViewController *dataViewController;
    dataViewController = [[LeafletPageContentViewController alloc]initWithNibName:@"LeafletPageContentViewController" bundle:nil];

    dataViewController.dataObject = [self.modelArray objectAtIndex:index];
    return dataViewController;

}
like image 2
jcesarmobile Avatar answered Nov 12 '22 05:11

jcesarmobile