获取UIPageViewController当前索引的可靠方法

我正在寻找一种可靠的方式来跟踪UIPageViewController当前索引。

这个问题是众所周知的。 虽然viewControllers正在正确呈现,但很难跟踪当前的索引。

我认为在SO社区中刷新这个主题是很好的,因为由于某种原因它仍然没有解决

我在这里浏览了很multithreading,但是大多数答案已经过时或被标记为不可靠(结果取决于用户是否完全刷卡或者只是半刷卡等)

我已经访问过这个线程,但是没有提供任何明确的正确答案。

我试过了:

1)跟踪viewController的视图标签 – 链接 – 总是返回0

2)查看两个UIPageViewController方法中的索引variables, viewControllerBeforeViewControllerviewControllerAfterViewControlle

其结果是不可预测的,有时会跳过一个索引等。

有没有人想出一个好方法,可靠的方法来跟踪UIPageCiewController索引来利用它(例如打印当前索引)?

我会很欣赏obj-c和快速实现,但快速是我正在寻找。

这是为ObjC

ParentViewController

 #import "PagesViewController.h" // Delegate: PageViewDelegate // Declared inside `PagesViewController` // @interface ParentViewController () <UIPageViewControllerDataSource, UIPageViewControllerDelegate, PageViewDelegate> @property (nonatomic) UIPageViewController *pageViewController; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil]; self.pageViewController.dataSource = self; self.pageViewController.view.frame = self.view.frame; // im setting page 3 as the default page // [self.pageViewController setViewControllers:[NSArray arrayWithObject:[self viewControllerAtIndex:3]] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil]; [self addChildViewController:self.pageViewController]; [self.view addSubview:self.pageViewController.view]; } - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { NSUInteger index = [(PagesViewController *)viewController index]; if (index == 0) { return nil; } index--; return [self viewControllerAtIndex:index]; } - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { NSUInteger index = [(PagesViewController *)viewController index]; index++; if (index == 5) { return nil; } return [self viewControllerAtIndex:index]; } - (PagesViewController *)viewControllerAtIndex:(NSInteger)index { PagesViewController *vc = [[PagesViewController alloc] init]; // set delegate here.. // vc.delegate = self; // other data // vc.index = index; vc.titleLabel = [NSString stringWithFormat:@"Screen :%ld", (long)index]; return vc; } - (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController { // The number of items reflected in the page indicator. return x; } - (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController { // The selected item reflected in the page indicator. return x; } // This is what you need // - (void)viewController:(id)VC didShowWithIndex:(long)index { NSLog(@"didShowWithIndex: %ld", index); } 

PagesViewController.h

 @protocol PageViewDelegate <NSObject> - (void)viewController:(id)VC didShowWithIndex:(long)index; @end @interface PagesViewController : UIViewController @property (weak) id <PageViewDelegate> delegate; @property (nonatomic) NSInteger index; @property (nonatomic) NSString *titleLabel; @end 

PagesViewController.m

 @implementation PagesViewController - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor blackColor]; UILabel *titleLabel = [[UILabel alloc] initWithFrame:self.view.frame]; titleLabel.textAlignment = NSTextAlignmentCenter; titleLabel.textColor = [UIColor whiteColor]; titleLabel.text = self.titleLabel; [self.view addSubview:titleLabel]; } // Trigger delegate here // - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [self.delegate viewController:self didShowWithIndex:self.index]; } @end 

像@ 0yeojbuild议的那样,代表团的devise模式就是这里的解决scheme。 这需要一些思考。

让我们添加协议IndexDelegate并修改一下PageContentViewController

 protocol IndexDelegate { func showIndex(index:Int) } import UIKit class PageContentViewController: UIViewController { @IBOutlet weak var imageView: UIImageView! var delegate:IndexDelegate? var pageIndex:Int = 0 var imageFile:String! override func viewDidLoad() { super.viewDidLoad() self.imageView.image = UIImage(named: self.imageFile) } override func viewDidAppear(animated: Bool) { self.delegate!.showIndex(self.pageIndex) } 

现在在我们的父视图控制器我们遵守协议

 func showIndex(index: Int) { print(index) } 

不要忘记设置yourPageContentViewControllerInstance.delegate = self和inheritance协议YourParentViewController:UIViewController, UIPageViewControllerDataSourceDelegate, IndexDelegate {}

而已! 完美可靠的工作,并不落后!