获取UIPageViewController当前索引的可靠方法
我正在寻找一种可靠的方式来跟踪UIPageViewController当前索引。
这个问题是众所周知的。 虽然viewControllers正在正确呈现,但很难跟踪当前的索引。
我认为在SO社区中刷新这个主题是很好的,因为由于某种原因它仍然没有解决
我在这里浏览了很multithreading,但是大多数答案已经过时或被标记为不可靠(结果取决于用户是否完全刷卡或者只是半刷卡等)
我已经访问过这个线程,但是没有提供任何明确的正确答案。
我试过了:
1)跟踪viewController的视图标签 – 链接 – 总是返回0
2)查看两个UIPageViewController方法中的索引variables, viewControllerBeforeViewController
和viewControllerAfterViewControlle
其结果是不可预测的,有时会跳过一个索引等。
有没有人想出一个好方法,可靠的方法来跟踪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 {}
而已! 完美可靠的工作,并不落后!