我正在实现一个基于页面的应用程序。
基本上,pageViewController将用于显示数据页面。
相同的格式不同的数据。
创建了一个用来保存pageViewController的ViewController和另一个用来表示数据的viewController。
我只需要一个不同的viewController来存储数据,我发现这可能是个问题。
普通的寻呼机,比如Android的ViewPager,会要求你返回你想要显示的视图,给出一个索引,PageViewController不是这样工作的,它只是要求你提供下一个和前一个视图控制器。
我希望将索引存储在content ViewController的属性中可以完成这项工作……但事实并非如此。
它正在部分工作,但是..
下面是我的相关代码:
- (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开始,我滑动到下一页,在日志中看到以下内容
move right index 0
move left index 0
Right
didFinishAnimating view tag 1
move right index 1哇,这么多电话……但显示的索引仍然正常
再次滑动到下一页
Right
didFinishAnimating view tag 2
move right index 2此时索引显示正确,问题开始于改变方向。
滑动到上一个,现在我看到了这个:
Right
didFinishAnimating view tag 3
move left index 3在确定滑动方向时,在didFinishAnimating上看起来失败,但显示的索引仍然正常
再次向左滑动
Left
didFinishAnimating view tag 2这里似乎没有调用viewControllerBeforeViewController,我们已经从0->1->2->1->0开始了,对吗?但显示的索引已完成0->1->2->1->2
如果我再次向左滑动,我可以看到它转到->1->0->-1,就像它应该的那样。
这同样适用于另一种方式。
因此,我认为viewControllerBeforeViewController和viewControllerAfterViewController是不可靠的,didFinishAnimating不能单独确定滑动方向。
我有没有办法做好这件事,或者我只是在做一些不好的事情?
很抱歉我的帖子太大了,希望有人能帮我。
发布于 2015-10-01 16:26:42
你能做的就是使用ViewControllerAtIndex方法。在该方法内部,根据索引相应地设置contentViewControllers属性。
然后,在contentView控制器的viewDidAppear方法中,您将获得在ViewControllerAtIndex方法中设置的值,您可以根据需要使用这些值。
https://stackoverflow.com/questions/32882673
复制相似问题