Reputation: 295
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.... ???
Upvotes: 16
Views: 19104
Reputation: 12336
you always need this simple function:
var currentIndex: Int {
if let visibleViewController = viewControllers?.first,
let ci = pages.firstIndex(of: visibleViewController) {
return ci
}
else {
return 0
}
}
animate to any page:
public func go(toIndex: Int) {
setViewControllers(
[pages[toIndex]],
direction: ((currentIndex < toIndex) ? .forward : .reverse),
animated: true)
}
Upvotes: 2
Reputation: 3547
Swift Code:
func goToPage(index: Int) {
if index < viewControllers.count {
pageVC!.setViewControllers([viewControllers[index]], direction: .Forward, animated: true, completion: nil)
}
}
Upvotes: 6
Reputation: 537
@milijan answer worked great. Here is the swift version of his answer:
func jumptoPage(index : Int) {
let vc = viewControllerAtIndex(index)
let direction : UIPageViewControllerNavigationDirection!
if currentIndex < index {
direction = UIPageViewControllerNavigationDirection.Forward
}
else {
direction = UIPageViewControllerNavigationDirection.Reverse
}
if (currentIndex < index) {
for var i = 0; i <= index; i++ {
if (i == index) {
self.newPageViewController.setViewControllers([vc], direction: direction, animated: true, completion: nil)
}
else {
self.newPageViewController.setViewControllers([viewControllerAtIndex(i)], direction: direction, animated: false, completion: nil)
}
}
}
else {
for var i = currentIndex; i >= index; i = i - 1 {
if i == index {
self.newPageViewController.setViewControllers([vc], direction: direction, animated: true, completion: nil)
}
else {
self.newPageViewController.setViewControllers([viewControllerAtIndex(i)], direction: direction, animated: false, completion: nil)
}
}
}
currentIndex = index
}
Upvotes: 2
Reputation: 921
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;
}
Upvotes: 3
Reputation: 53341
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;
}
Upvotes: 2
Reputation: 135558
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).
Upvotes: 6