使用 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 工作正常。属性currentIndexviewDidLoad 中定义,第一页的值为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

使用 UIPageViewController 在多个视图控制器之间滑动

使用 UIPageViewController 创建网格/地图

禁用 UIPageViewController 反弹

如何让 UIPageViewController 使用过渡样式滚动?