6

我想使用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”,但我无法检查页面转换是否已完成(我可以在上述方法中执行此操作)知道我如何知道用户是否向后滑动或进一步滑动上面的方法?

4

4 回答 4

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 在此处输入链接描述

于 2014-12-20T02:23:24.147 回答
4

根据文档,似乎没有办法判断用户是向前还是向后滑动了页面。布尔值“完成”将告诉您用户是否已完成翻页。

一种解决方法:

创建一个 int 变量并使用 viewControllerAfterViewController 和 viewControllerBeforeViewController 方法增加或减少变量的值。用它来测试他们是向前还是向后移动。

编辑:您可以presentationIndexForPageViewController文档中使用

编辑2:在此处检查此链接有一个名为setViewControllers:direction:animated:completion:方向的方法将是UIPageViewControllerNavigationDirectionForwardUIPageViewControllerNavigationDirectionReverse

编辑 3:代码 - 这是假设您知道将通过前进或后退调用哪个视图控制器:

在您的 appDelegate 和 setter 方法上创建一个变量:

int indexVar;

- (void)setIndex:(int)indexVar;

然后在您的视图控制器(向前或向后)上增加值或减少值(viewDidLoad):

(AppDelegate *)[[UIApplication sharedApplication] delegate] setIndex:<whatever>];

类似的东西。这不是实现目标的确切方法,但希望它能让你朝着正确的方向前进。

于 2013-04-24T20:48:26.997 回答
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;
    }
}

希望这可以帮助!

于 2015-03-09T16:22:00.983 回答
0

我通过在每个 ViewController 类中创建协议来做到这一点,并在 viewWillAppear 方法中调用协议方法。然后在 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;
}

最后,我正在实现我的自定义委托方法,在我的例子中是刷新我在 PageViewController 顶部设置的标签文本。

-(void)viewWillAppearMyPageNumber:(int)myPageNumber{
    [self refreshLabelsOnCurrentPageWithIndex:myPageNumber];
}
于 2015-01-05T09:13:19.787 回答