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);
}
我已经创建了 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);
}