iOS - UIPageViewControllerDataSource方法调用两次 [英] iOS - UIPageViewControllerDataSource method called twice

查看:674
本文介绍了iOS - UIPageViewControllerDataSource方法调用两次的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我发现两个 UIPageViewControllerDataSource 方法存在一个奇怪的问题:我第一次进入页面视图控制器场景并拖动控制器的内容,无论是什么拖动方向是,两个数据源方法都被调用。我想当我在第一页并向右拖动时,这意味着在第一页之前没有更多的页面,这两种方法都不应该被调用。如果我向左拖动,只应调用after方法。

I found a weird issue with the two UIPageViewControllerDataSource methods: the first time I enter the page view controller scene and drag on the content of the controller, no matter what the dragging direction is, both of the data source methods get called. I suppose that when I'm at the first page and drag to the right, which means that there is no more page before the first page, neither of the methods should get called. And if I drag to the left, only the after method should get called.

我按照这篇文章设置了视图控制器(除了我在故事板上没有单独的页面视图控制器。我使用传统的 [UIPAgeViewController alloc] init] 方法来实例化控制器)。下面是我的代码:

I followed this post to set up the view controllers (except that I do not have a separate page view controller on the storyboard. I used the traditional [UIPAgeViewController alloc] init] method to instantiate the controller). Below is my code:

对于实际显示页面视图控制器内容的视图控制器(仅显示 viewDidLoad 显示):

For the view controller that actually displays the content of the page view controller (only the relevant part of viewDidLoad is shown):

 - (void)viewDidLoad 
{
    // initialize page view controller
    _pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];
    self.pageViewController.delegate = self;
    self.pageViewController.dataSource = self;

    // set up the initial scene of the page view controller
    UIViewController *viewController = [self viewControllerAtIndex:0];
    [self.pageViewController setViewControllers:@[viewController]
                                      direction:UIPageViewControllerNavigationDirectionForward
                                       animated:NO
                                     completion:nil];

    // adjust the size of the page view controller, -44 to show the buttons at the bottom
    self.pageViewController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - 44);

    // display the content of the page view controller
    [self addChildViewController:self.pageViewController];
    [self.view addSubview:self.pageViewController.view];
    [self.pageViewController didMoveToParentViewController:self];
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController
      viewControllerBeforeViewController:(UIViewController *)viewController
{
    NSUInteger index = ((PWCPageContentViewController *)viewController).index;
    if (index == 0 || index == NSNotFound) {
        return nil;
    }
    --index;
    return [self viewControllerAtIndex:index];
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController
       viewControllerAfterViewController:(UIViewController *)viewController
{
    NSUInteger index = ((PWCPageContentViewController *)viewController).index;
    if (index == self.numberOfPages - 1 || index == NSNotFound) {
        return nil;
    }
    ++index;
    return [self viewControllerAtIndex:index];
}

- (PWCPageContentViewController *)viewControllerAtIndex:(NSUInteger)index
{
    PWCPageContentViewController *viewController =
    [self.storyboard instantiateViewControllerWithIdentifier:@"PageContentViewController"];
    viewController.index = index;
    NSString *text = [self.notes getNoteAtIndex:index];
    [viewController.textView setText:text];

    return viewController;
}

对于PWCPageContentViewController.h:

For PWCPageContentViewController.h:

#import <UIKit/UIKit.h>

@class PWCNotes;

@interface PWCPageContentViewController : UIViewController <UITextViewDelegate>

@property NSUInteger index;
@property (weak, nonatomic) IBOutlet UITextView *textView;

- (void)dismissKeyboard;

@end

对于PWCPageContentViewController.m:

For PWCPageContentViewController.m:

#import "PWCPageContentViewController.h"

@interface PWCPageContentViewController ()

@end

@implementation PWCPageContentViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.textView.delegate = self;
}

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

- (void)dismissKeyboard
{
    if ([self.textView isFirstResponder]) {
        // dismiss the keyboard when hitting save
        [self.textView resignFirstResponder];
    }
}

@end

所以这是一个已知问题还是我错过了什么?

So is this a known issue or am I missing something?

推荐答案

UIPageViewController 使用这些波纹管方法获取后面和前面的ViewController。

UIPageViewController uses these bellow method for getting the back and front ViewController.

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController;
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController;

虽然它很奇怪但是它是一个已知问题。每次调用Before和After方法获取VC。如果没有下一个VC,那么它返回 nil ,如果没有以前的VC, datasourceDelegate 返回nil,否则它返回VC的索引。

Though its weird but yes its a known issue. Every time it calls Before and After method to get VC. If there is no next VC then it returns nil and if there is no previous VC the datasourceDelegate return nil, otherwise it return the index of VC.

UIPageViewControllerDelegate 中,有一个名为的函数:

In UIPageViewControllerDelegate, there is a function named :

 - (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers;

看看这可能有助于从 pendingViewControllers 数组。

Look at this it might help to get the current or next/previous viewcontroller from pendingViewControllers array.

希望这会有所帮助.. :)

Hope this helps.. :)

这篇关于iOS - UIPageViewControllerDataSource方法调用两次的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆