PageViewController 点击事件

PageViewController click event

我已经创建了 PageViewController,但无法弄清楚如何捕获正在单击的页面索引。

根据这些信息,我可以转到 DetailViewController 以加载相应的信息。

- (void)viewDidLoad {
    [super viewDidLoad];

    arrPageTitles = @[@"0",@"1",@"2",@"3", @"4"];
    self.newsPageImages = @[@"img1.jpg", @"img2.jpg", @"img3.png", @"img4.jpg", @"img5.jpg"];

    // Create page view controller
    self.PageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageViewController"];
    self.PageViewController.dataSource = self;
    self.PageViewController.delegate = self;
    MainNewsPageContentViewController *startingViewController = [self viewControllerAtIndex:0];
    NSArray *viewControllers = @[startingViewController];
    [self.PageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];

    // Change the size of page view controller
    self.PageViewController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - 30);
    [self addChildViewController:PageViewController];
    [self.view addSubview:PageViewController.view];
    [self.PageViewController didMoveToParentViewController:self];
    [self.view bringSubviewToFront:self.pageControl];
    self.pageControl.numberOfPages = [self.arrPageTitles count];
    self.pageControl.currentPage = 0;   

   for (UITapGestureRecognizer * gesRecog in self.PageViewController.gestureRecognizers)
    {
        gesRecog.delegate = self;
    }
}


-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    if (touch.view != self.PageViewController.view)
    {
        return NO;
    }
  return YES;
} 

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
    NSUInteger index = ((MainNewsPageContentViewController*) viewController).pageIndex;
    [self.pageControl setCurrentPage:index];

    if ((index == 0) || (index == NSNotFound))
    {
        return nil;
    }
    index--;

    return [self viewControllerAtIndex:index];
}    


- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
    NSUInteger index = ((MainNewsPageContentViewController*) viewController).pageIndex;
    [self.pageControl setCurrentPage:index];

    if (index == NSNotFound)
    {
        return nil;
    }
    index++;

    if (index == [self.arrPageTitles count])  {
        return nil;
    }
    return [self viewControllerAtIndex:index];
}

- (MainNewsPageContentViewController *)viewControllerAtIndex:(NSUInteger)index
{
    if (([self.arrPageTitles count] == 0) || (index >= [self.arrPageTitles count])) {
        return nil;
    }
    // Create a new view controller and pass suitable data.
    MainNewsPageContentViewController *pageContentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MainNewsPageContentViewController"];
    pageContentViewController.txtTitle = self.arrPageTitles[index];
    pageContentViewController.imageFile = self.newsPageImages[index];
    pageContentViewController.pageIndex = index;
    return pageContentViewController;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - Navigation

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

     if ([[segue identifier] isEqualToString:@"isMainDetailSegue"])
     {
         DetailViewController *dvc = [segue destinationViewController];
         dvc.pageIndex = [self.pageControl currentPage];
     }
 }

更新

我试图传递点击索引,但无论我点击哪个页面内容视图,它总是显示 0。

- (MainNewsPageContentViewController *)viewControllerAtIndex:(NSUInteger)index
{
    if (([self.arrPageTitles count] == 0) || (index >= [self.arrPageTitles count])) {
        return nil;
    }
    // Create a new view controller and pass suitable data.
    MainNewsPageContentViewController *pageContentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MainNewsPageContentViewController"];
    pageContentViewController.txtTitle = self.arrPageTitles[index];
    pageContentViewController.imageFile = self.newsPageImages[index];
    pageContentViewController.pageIndex = index;
    UITapGestureRecognizer *tap2 = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(move:)];
    tap2.view.tag = index;
    [pageContentViewController.view addGestureRecognizer:tap2];
    return pageContentViewController;
}

-(void) tap2 : (UITapGestureRecognizer*)sender
{
    UIView *view = sender.view; //cast pointer to the derived class if needed
    NSLog(@"%ld", (long)view.tag);
}

您可以在 UIPageViewcontroller's 委托方法中添加以下代码

-(void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed{
    if (completed) {
        currentPageIndex = [self indexOfController:[pageViewController.viewControllers lastObject]];    
    }
}

辅助方法是

-(NSInteger)indexOfController:(UIViewController *)viewController{
    for (int i = 0; i<[self.viewControllerArray count]; i++) {
        if (viewController == [self.viewControllerArray objectAtIndex:i])
        {
            return i;
        }
    }
    return NSNotFound;
}

在您的 ViewController 中添加一个 TapGestureRecognizer

 - (MainNewsPageContentViewController *)viewControllerAtIndex:(NSUInteger)index
{
    if (([self.arrPageTitles count] == 0) || (index >= [self.arrPageTitles count])) {
        return nil;
    }
    // Create a new view controller and pass suitable data.
    MainNewsPageContentViewController *pageContentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MainNewsPageContentViewController"];
    pageContentViewController.txtTitle = self.arrPageTitles[index];
    pageContentViewController.imageFile = self.newsPageImages[index];
    pageContentViewController.pageIndex = index;
    UITapGestureRecognizer *tap2 = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap2:)];
    [pageContentViewController.view addGestureRecognizer:tap2];
    tap2.view.tag = index;
    return pageContentViewController;
}

-(void) tap2 : (UITapGestureRecognizer*)sender
{
    UIView *view = sender.view; //cast pointer to the derived class if needed
    NSLog(@"%ld", (long)view.tag);
}