首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIPageViewController实现

UIPageViewController实现
EN

Stack Overflow用户
提问于 2015-10-01 16:17:26
回答 1查看 183关注 0票数 0

我正在实现一个基于页面的应用程序。

基本上,pageViewController将用于显示数据页面。

相同的格式不同的数据。

创建了一个用来保存pageViewController的ViewController和另一个用来表示数据的viewController。

我只需要一个不同的viewController来存储数据,我发现这可能是个问题。

普通的寻呼机,比如Android的ViewPager,会要求你返回你想要显示的视图,给出一个索引,PageViewController不是这样工作的,它只是要求你提供下一个和前一个视图控制器。

我希望将索引存储在content ViewController的属性中可以完成这项工作……但事实并非如此。

它正在部分工作,但是..

下面是我的相关代码:

代码语言:javascript
复制
- (void)viewDidLoad {
    [super viewDidLoad];
    
    page = [[UIPageViewController alloc]initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];
    
    [page setDelegate:self];
    [page setDataSource:self];
    index = 0;
    
    CampaignContent * content = [[CampaignContent alloc]initWithNibName:@"CampaignContent" bundle:nil];
    [content setTitlestr:@"Index 0"];
    [content setDesc:@"desc1"];
    [content.view setTag:1];
    
    [page setViewControllers:@[content] direction:UIPageViewControllerNavigationDirectionForward animated:TRUE completion:nil];
    
    [page willMoveToParentViewController:self];
    
    [self addChildViewController:page];
    [self.view addSubview:page.view];

    [page didMoveToParentViewController:self];
}

-(UIViewController*)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
    last=false;
    NSLog(@"move right index %i",index);
    CampaignContent * content = [[CampaignContent alloc]initWithNibName:@"CampaignContent" bundle:nil];
    [content setTitlestr:[NSString stringWithFormat:@"Index %i",index+1]];
    [content.view setTag:viewController.view.tag+1];
    return content;
}

- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
{
    if(completed)
    {
    if([[previousViewControllers objectAtIndex:0] view].tag<index){
        NSLog(@"Left");
        index = index-1;
    }else{
        NSLog(@"Right");
        index = index+1;
    }
        NSLog(@"didFinishAnimating view tag %i",[[previousViewControllers objectAtIndex:0] view].tag,index);
    }
}

-(UIViewController*)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
    last= true;
    NSLog(@"move left index %i",index);
    CampaignContent * content = [[CampaignContent alloc]initWithNibName:@"CampaignContent" bundle:nil];
    [content setTitlestr:[NSString stringWithFormat:@"Index %i",index-1]];
    [content.view setTag:viewController.view.tag-1];
    return content;
}

我只想看到索引正常工作,但却...

从0开始,我滑动到下一页,在日志中看到以下内容

代码语言:javascript
复制
move right index 0
move left index 0
Right
didFinishAnimating view tag 1
move right index 1

哇,这么多电话……但显示的索引仍然正常

再次滑动到下一页

代码语言:javascript
复制
Right
didFinishAnimating view tag 2
move right index 2

此时索引显示正确,问题开始于改变方向。

滑动到上一个,现在我看到了这个:

代码语言:javascript
复制
Right
didFinishAnimating view tag 3
move left index 3

在确定滑动方向时,在didFinishAnimating上看起来失败,但显示的索引仍然正常

再次向左滑动

代码语言:javascript
复制
Left
didFinishAnimating view tag 2

这里似乎没有调用viewControllerBeforeViewController,我们已经从0->1->2->1->0开始了,对吗?但显示的索引已完成0->1->2->1->2

如果我再次向左滑动,我可以看到它转到->1->0->-1,就像它应该的那样。

这同样适用于另一种方式。

因此,我认为viewControllerBeforeViewController和viewControllerAfterViewController是不可靠的,didFinishAnimating不能单独确定滑动方向。

我有没有办法做好这件事,或者我只是在做一些不好的事情?

很抱歉我的帖子太大了,希望有人能帮我。

EN

回答 1

Stack Overflow用户

发布于 2015-10-01 16:26:42

你能做的就是使用ViewControllerAtIndex方法。在该方法内部,根据索引相应地设置contentViewControllers属性。

然后,在contentView控制器的viewDidAppear方法中,您将获得在ViewControllerAtIndex方法中设置的值,您可以根据需要使用这些值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32882673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档