使用 UIPageViewController 导航
Posted
技术标签:
【中文标题】使用 UIPageViewController 导航【英文标题】:Navigation with UIPageViewController 【发布时间】:2014-04-21 12:48:43 【问题描述】:对不起我的英语:))
我使用 UIPageViewController 在页面之间导航。第一页是所有页面的目录。当我单击目录中的元素时,我尝试使用上述方法更改页面:
-(void) flipToPage:(int)index
BaseArtViewController *pageViewController = [self viewControllerAtIndex:index];
NSArray *viewControllers = [NSArray arrayWithObjects:pageViewController, nil];
if (currentIndex < index)
[self.pageController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:NULL];
else if (currentIndex > index)
[self.pageController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionReverse animated:YES completion:NULL];
// For change pageControl aspect
NSArray *subviews = self.pageController.view.subviews;
UIPageControl *thisControl = nil;
for (int i=0; i<[subviews count]; i++)
if ([[subviews objectAtIndex:i] isKindOfClass:[UIPageControl class]])
thisControl = (UIPageControl *)[subviews objectAtIndex:i];
thisControl.currentPage = index;
它可以正常工作但不正确,目录和页面访问之间没有过渡。
当我到达点击的页面时,如果我尝试访问上一页,例如我在第 4 页,我想进入第 3 页,但我在第 0 页(目录)返回。你知道一个解决方案或有人可以解释我怎么做吗???
感谢您的帮助!
【问题讨论】:
如果您发布了 viewControllerBeforeViewController 和 viewControllerAfterViewController 方法会很有帮助。 1) 视图控制器页面的索引是否设置正确,所以它们返回 0 表示第一页,1 表示第二页,等等? 2) 方法 viewControllerAtIndex 是否实现为返回指定索引的正确视图控制器页面?此外,它看起来不像您正在初始化 currentIndex,我认为您应该在“if”语句之后将其设置为 FlipToPage 中的“index”。 每个索引都是正确的。方法viewControllerAtIndex
工作正常。属性currentIndex
在viewDidLoad
中定义,第一页的值为0。我试图更改flipToPage
中的索引,但没有任何改变。当我第一次返回上一页时,我访问了目录页。如有必要,我可以发布完整的课程。
我认为到目前为止您发布的内容没有任何问题。我已经实现了非常相似的代码并且它工作正常。我可以直接移动到任何页面,然后从该点前后移动。
如果您发布创建视图控制器页面的代码,也许我可以找到问题。
【参考方案1】:
谢谢,
这是我的代码:
-(UIViewController*) pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
NSUInteger index = [(BaseArtViewController *)viewController index];
NSLog(@"Index Before : %i", index);
if (index == 0) return nil;
// Change index
index--;
// Stock current index
currentIndex = index;
return [self viewControllerAtIndex:index];
-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
NSUInteger index = [(BaseArtViewController *)viewController index];
NSLog(@"Index After : %i", index);
// Change index
index++;
if (index == nbPages) return nil;
// Stock current index
currentIndex = index;
return [self viewControllerAtIndex:index];
对于初始化:
-(void) initPresentation
self.pageController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];
self.pageController.dataSource = self;
[[self.pageController view] setFrame:[[self view] bounds]];
BaseArtViewController *initialViewController = [self viewControllerAtIndex:currentIndex];
NSArray *viewControllers = [NSArray arrayWithObject:initialViewController];
[self.pageController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
[self addChildViewController:self.pageController];
[[self view] addSubview:[self.pageController view]];
[self.pageController didMoveToParentViewController:self];
基类:BaseArtViewController.h #导入
@interface BaseArtViewController : UIViewController
@property (assign, nonatomic) NSInteger index;
@property (assign, nonatomic) NSArray *tabS;
@end
基类:BaseArtViewController.m
#import "BaseArtViewController.h"
@interface BaseArtViewController ()
@end
@implementation BaseArtViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self)
// Custom initialization
return self;
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view.
NSLog(@"Index Page : %i", self.index);
- (void)didReceiveMemoryWarning
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
@end
【讨论】:
以上是关于使用 UIPageViewController 导航的主要内容,如果未能解决你的问题,请参考以下文章
UIPageviewController 使用 Storyboard 崩溃
使用 UIPageViewController 在多个视图控制器之间滑动