iOS - UIPageViewControllerDataSource方法调用两次

lji*_*atu 8 objective-c ios uipageviewcontroller

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

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

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

 - (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;
}
Run Code Online (Sandbox Code Playgroud)

对于PWCPageContentViewController.h:

#import <UIKit/UIKit.h>

@class PWCNotes;

@interface PWCPageContentViewController : UIViewController <UITextViewDelegate>

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

- (void)dismissKeyboard;

@end
Run Code Online (Sandbox Code Playgroud)

对于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
Run Code Online (Sandbox Code Playgroud)

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

Kin*_*ard 5

解决Swift中的这个问题:

当我使用3个以上时遇到了这个错误UIPageViewController(UIPageViewController例如尝试使用@ Rashad的代码片段4).问题来自缺少和未实现的可选UIPageViewControllerDelegate的方法,这导致UIPageControl疯狂和不稳定.

请找到修复以下错误的特定方法:

/*
    Optional UIPageViewControllerDelegate method

    Sent when a gesture-initiated transition ends. The 'finished' parameter indicates whether
    the animation finished, while the 'completed' parameter indicates whether the transition completed or bailed out (if the user let go early).
*/
func pageViewController(pageViewController: UIPageViewController,
    didFinishAnimating finished: Bool,
    previousViewControllers: [AnyObject],
    transitionCompleted completed: Bool)
{
    // Turn is either finished or aborted
    if (completed && finished) {
        let currentDisplayedViewController = self.pageViewController!.viewControllers[0] as! ContentViewController
        self.pageControl.currentPage = currentDisplayedViewController.index
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您想获得完整的工作项目,请在下面找到Github链接:

(该项目的Github链接)


Ras*_*had 2

UIPageViewController使用以下方法来获取后视图控制器和前视图控制器。

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController;
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController;
Run Code Online (Sandbox Code Playgroud)

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

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

 - (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers;
Run Code Online (Sandbox Code Playgroud)

看看这个,它可能有助于从pendingViewControllers数组中获取当前或下一个/上一个视图控制器。

希望这可以帮助.. :)