我想使用UIPageViewController
跟踪索引。每当我刷卡时,我都需要index++
或index--
。无论何时向后或向后滑动,都会调用此委托方法:
- (void)pageViewController:(UIPageViewController *)pvc didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
{
// If the page did not turn
if (!completed)
{
// You do nothing because whatever page you thought
// the book was on before the gesture started is still the correct page
return;
}
// I want to check here whenever the page was swiped back or further
}
如果用户向后或向后滑动,如何检查此方法?我知道有2个DataSource方法" viewControllerAfterViewController"和" viewControllerBeforeViewController"但我无法检查页面转换是否已完成(我可以在上面的方法中执行此操作)任何想法我怎么知道用户是否在上述方法中向后滑动?
答案 0 :(得分:6)
使用协议:
MyClass : UIViewController <UIPageViewControllerDataSource,UIPageViewControllerDelegate
声明一个属性:
@property(nonatomic) NSInteger currentIndex;
@property(nonatomic) NSInteger nextIndex;
并在方法中:
-(void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers{
NewsTableViewController *controller = [pendingViewControllers firstObject];
self.nextIndex = [self.arrViews indexOfObject:controller];
}
-(void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed{
if (completed) {
self.currentIndex = self.nextIndex;
}
self.nextIndex = 0;
}
您将拥有当前页面。 感谢Corey Floyd在enter link description here
答案 1 :(得分:3)
根据documentation,似乎没有办法判断用户是向前还是向后滑动页面。布尔“完成”将告诉您用户是否已完成翻页。
解决方法:
创建一个int变量,并使用viewControllerAfterViewController和viewControllerBeforeViewController方法增加或减少变量的值。用它来测试它们是否向前或向后移动。
修改:您可以使用documentation
中的presentationIndexForPageViewController
修改2:点击此链接here有一个名为setViewControllers:direction:animated:completion:
的方法,方向可以是UIPageViewControllerNavigationDirectionForward
或UIPageViewControllerNavigationDirectionReverse
编辑3:代码 - 假设您知道将向前或向后调用哪个视图控制器:
在appDelegate和setter方法上创建一个变量:
int indexVar;
- (void)setIndex:(int)indexVar;
然后在视图控制器上(向前或向后)增加值或减小值(viewDidLoad):
(AppDelegate *)[[UIApplication sharedApplication] delegate] setIndex:<whatever>];
这些方面的东西。这不是实现目标的准确方法,但希望它会让你朝着正确的方向前进。
答案 2 :(得分:0)
我是通过在viewWillAppear方法中调用协议方法在每个ViewController类中创建协议来实现的。然后在PageViewController中,每当我实例化其中一个视图控制器时,我将其委托设置为PageViewController。 这是我项目中的第三个ViewController(请注意,我已在每个视图控制器中完成此操作)
@class ViewController3;
@protocol ViewControllerPageNumber <NSObject>
-(void)viewWillAppearMyPageNumber:(int)myPageNumber;
@end
@interface ViewController3 : UIViewController
@property (nonatomic, weak) id <ViewControllerPageNumber> delegate;
@end
和viewWillAppear方法中的.m文件
-(void)viewWillAppear:(BOOL)animated{
[self.delegate viewWillAppearMyPageNumber:3];//The 3 will be different for each ViewController
}
接下来,在PageViewController.m中,每当我实例化一个视图控制器时,我将其委托设置为self(或PageViewController)。 viewCons只是一个带有viewControllers名称的字符串数组。
- (UIViewController *)viewControllerAtIndex:(NSUInteger)index {
id vc = [[NSClassFromString([viewCons objectAtIndex:index]) alloc] init];
if([vc isMemberOfClass:[NSClassFromString(@"ViewController3") class]]){
ViewController3 *vc3=(ViewController3 *) vc;
vc3.delegate=self;
}else if([vc isMemberOfClass:[NSClassFromString(@"ViewController2") class]]){
ViewController2 *vc2=(ViewController2 *) vc;
vc2.delegate=self;
}else if([vc isMemberOfClass:[NSClassFromString(@"ViewController") class]]){
ViewController *vc1=(ViewController *) vc;
vc1.delegate=self;
}
return vc;
}
最后,我实现了我的自定义委托方法,在我的例子中,它是刷新标签&#39;我已经在PageViewController上设置了文本。
-(void)viewWillAppearMyPageNumber:(int)myPageNumber{
[self refreshLabelsOnCurrentPageWithIndex:myPageNumber];
}
答案 3 :(得分:0)
我认为最简单的解决方案是创建一个自己的ViewController类,其中包含一个跟踪当前显示索引的属性。在大多数情况下,无论如何我都需要为我的PageViewController定制一个ViewController。在我的示例中,这是以下类。
@interface PageZoomViewController : UIViewController
@property (nonatomic) int pageIndex;
@end
然后在viewControllerAfter / Before方法中,您可以将索引传递给新页面。
-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController {
int nextPageIndex = ((PageZoomViewController *)viewController).pageIndex-1;
PageZoomViewController *controller = [[PageZoomViewController alloc] initWithPageViewControlParent:self andFrame:[self frameForPagingScrollView] andPageIndex:nextPageIndex];
return controller;
}
当下一页的动画完成后,您可以像这样轻松设置当前索引。
-(void)pageViewController:(UIPageViewController *)thePageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed {
if(completed) {
index = ((PageZoomViewController *)thePageViewController.viewControllers[0]).pageIndex;
}
}
希望这有帮助!