Reputation: 767
I have two storyboards with identifiers "one" and "two", I have a UIPageViewController and a subclass of it. In the subclass I have this code below:
- (void)viewDidLoad
{
[super viewDidLoad];
self.dataSource = self;
self.delegate = self;
counter = 0;
[self setViewControllers:@[[self.storyboard instantiateViewControllerWithIdentifier:@"one"]] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
if ([viewController isKindOfClass:[ViewController class]]){
return [self.storyboard instantiateViewControllerWithIdentifier:@"one"];
}
return nil;
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
if ([viewController isKindOfClass:[secondViewController class]]){
return [self.storyboard instantiateViewControllerWithIdentifier:@"two"];
}
return nil;
}
This code works very well, but has a problem! The scroll is infinite; in my case I need to take off the infinite scroll. How I can do this?
First thing is create a counter and do checks inside my methods:
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
if (counter < 1) {
NSLog(@"Don't get back");
return nil;
}
......
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
if (counter >= 1) {
NSLog(@"Don't go anymore");
return nil;
}
....
}
The second thing is try to use counter++ and counter--. This is being a big puzzle to me, anyone have any better ideas?
Upvotes: 0
Views: 1160
Reputation: 263
Just a little change in the condition.
- (nullable UIViewController *)pageViewController:(nonnull UIPageViewController *)pageViewController viewControllerBeforeViewController:(nonnull UIViewController *)viewController {
NSUInteger currentIndex = [pages indexOfObject:viewController];
NSUInteger previousIndex = ((currentIndex - 1) % pages.count);
if (viewController == yourFirstViewController)
return nil;
return pages[previousIndex];
}
- (nullable UIViewController *)pageViewController:(nonnull UIPageViewController *)pageViewController viewControllerAfterViewController:(nonnull UIViewController *)viewController {
NSUInteger currentIndex = [pages indexOfObject:viewController];
NSUInteger nextIndex = ((currentIndex + 1) % pages.count);
if (viewController == yourLastViewController)
return nil;
return pages[nextIndex];
}
Upvotes: 1
Reputation: 17710
If you only have two pages, then simply check when you get a request for a page, if the current page is not already the one you would serve. For this, you need a way to identify it.
If each of the pages has a different class, you can simply check for the class. Otherwise you'll need some other criterion.
If using custom classes:
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
if ([viewController isKindOfClass:[ClassOfSecondViewController class]])
{
return [self.storyboard instantiateViewControllerWithIdentifier:@"one"];
}
return nil;
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
if ([viewController isKindOfClass:[ClassOfFirstViewController class]])
{
return [self.storyboard instantiateViewControllerWithIdentifier:@"two"];
}
return nil;
}
Upvotes: 1