iOS - UIPageViewControllerDataSource方法调用两次 [英] iOS - UIPageViewControllerDataSource method called twice
问题描述
我发现两个 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 $的相关部分c $ c>显示):
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屋!