2017-08-11 91 views
1

我已经创建了PageViewController,我无法弄清楚如何捕获正在被点击的页面索引。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]; 
    } 
} 

UPDATE

我试图通过点击指标,但它总是显示为0,不管我点击哪个pagecontentview。

- (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); 
} 
+0

TapGesture识别器在你的MainNewsPageContentViewController中并为每个添加一个标签? –

+0

可以请你举例说明吗? – hotspring

+0

我刚刚添加了手势识别器,但没有奏效。我在这个问题中更新了我的源代码。我不知道我做错了什么? – hotspring

回答

2

添加TapGestureRecognizer在ViewControllers

- (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); 
} 
+0

非常感谢,它就像一个魅力!将索引传递给'tap2'方法的最佳方法是什么? – hotspring

+0

请在编辑部分查看我的更新。我无法检索正确的索引值。 – hotspring

+1

只是移动这一行'tap2.view.tag = index;'在这个下面'[pageContentViewController.view addGestureRecognizer:tap2];'必须工作 –

0

您可以添加以下里面UIPageViewcontroller's委托方法代码

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

Helper方法是

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

'viewControllerArray'? – hotspring

+0

这就是你传递给你的pageViewController实例的viewControllers数组,我想你需要在同一个类中使它成为全局的,然后你可以访问 –

+0

我已经将你的答案添加到我的问题中,请参阅更新。这是行不通的。 – hotspring