Ответ 1
Похоже, вы должны получить текущий индекс с помощью:
ContentViewController *viewController = [self.pageViewController.viewControllers lastObject];
currentIndex = [modelArray indexOfObject:[viewController page]];
Я боролся с этой проблемой в течение последних нескольких дней, и после всего этого жонглирования я понял, что все, что мне нужно, это текущий индекс из метода источника данных для обновления с текущим номером видимой страницы
У меня есть этот метод UIPageViewController
datasource, и мне нужно использовать текущий индекс, чтобы получить текущую видимую страницу для метода делегата previousViewControllers transitionCompleted:(BOOL)completed
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController
viewControllerAfterViewController:(UIViewController *)viewController {
NSString *path = [[NSBundle mainBundle] pathForResource:@"pages" ofType:@"pdf"];
NSURL *pdfurl = [NSURL fileURLWithPath:path];
PDFDocument = CGPDFDocumentCreateWithURL((__bridge CFURLRef)pdfurl);
contentViewController = [[ContentViewController alloc] initWithPDFAtPath:path];
currentIndex = [modelArray indexOfObject:[(ContentViewController *)viewController page]];
if (currentIndex == totalPages - 1) {
return nil;
}
contentViewController.page = [modelArray objectAtIndex:currentIndex + 1];
return contentViewController;
}
Я смущен тем, как записать текущую инструкцию индекса из метода источника данных в метод делегата для обновления текущей видимой страницы.
- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed{
if (!completed)
{
return;
}
//currentIndex = [[self.pageViewController.viewController lastObject]];
currentIndex = [self indexOfObject:contentViewController];
[self displaycurrentIndex:currentIndex];
//self.pageControl.currentPage = currentIndex;
}
Как я могу это исправить?
Похоже, вы должны получить текущий индекс с помощью:
ContentViewController *viewController = [self.pageViewController.viewControllers lastObject];
currentIndex = [modelArray indexOfObject:[viewController page]];
для быстрого:
func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool){
let pageContentViewController = pageViewController.viewControllers![0] as! ViewController
let index = pageContentViewController.pageIndex
}
если вы реализуете ModelController (как в примере Apple), используйте его метод indexOfViewController
- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed {
myDataViewController *currentView = [pageViewController.viewControllers objectAtIndex:0];
NSInteger currentIndex = [_modelController indexOfViewController:currentView];
[self displayPageNumber:currentIndex];
}
Реализация метода делегирования
- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed{
NSLog(@"Current Page = %@", pageViewController.viewControllers);
UIViewController *currentView = [pageViewController.viewControllers objectAtIndex:0];
if ([currentView isKindOfClass:[FirstPageViewController class]]) {
NSLog(@"First View");
}
else if([currentView isKindOfClass:[SecondPageViewController class]]){
NSLog(@"Second View");
}
else if([currentView isKindOfClass:[ThirdViewController class]]){
NSLog(@"Third View");
}
}
//pageViewController.viewControllers всегда возвращают текущий вид View ViewController
Я столкнулся с той же проблемой на страницеViewController, каждый раз, когда я прокручивал свой pageViewController, он дважды вызывал моего делегата и не смог найти проблему. И мой массив динамический, поэтому я хочу получить правильное значение индекса из pageController. Прежде всего установите делегата вашего pageViewController. Вот так: -
self.pageViewController.delegate = self;
И затем добавьте этот делегат к вашему классу
- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
{
if (completed) {
NSInteger currentIndex = ((PageContentViewController *)self.pageViewController.viewControllers.firstObject).pageIndex;
NSLog(@"%ld",(long)currentIndex);
}
}
PageContentViewController - это класс, в котором вы показываете свои данные pageViewController.
Я тоже боролся с этим, и ни один из других решений не работал у меня, но, наконец, смог его решить, используя метод делегата:
Первый в PageContentViewController.h Добавьте следующее свойство:
@property NSUInteger pageIndex;
Второй создать протокол делегатов в PageContentViewController (не PageViewController).
В PageContentViewController.h:
@protocol PageContentDelegate <NSObject>
- (void)sendBackPageIndex:(NSUInteger)index;
@end
@interface LKFPageContentViewController : (UIViewController)
@property (weak, nonatomic) id<LKFPageContentDelegate> delegate;
....
@end
Третий в PageContentViewController.m. Выполняет метод делегата в viewDidAppear
//Note that this must be done in viewDidAppear not viewDidLoad
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:YES];
[self.delegate sendBackPageIndex:self.pageIndex];
Четвертый, в PageViewController.m реализовать метод делегата
#pragma mark - PageContentView delegate methods
- (void)sendBackPageIndex:(NSUInteger)index {
//This is where you get your current page index
NSUInteger currentPageIndex = index;
}
Пятый, в PageViewController.m убедитесь, что вы передали значение pageIndex и задали делегат
- (PageContentViewController *)viewControllerAtIndex:(NSUInteger)index {
if (([self.arrayOfTitles count] == 0) || (index >= [self.arrayOfTitles count])) {
return nil;
}
// Create a new view controller and pass suitable data.
PageContentViewController *pageContentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageContentViewController"];
pageContentViewController.pageIndex = index;
pageContentViewController.delegate = self;
return pageContentViewController
}
Я решил эту проблему следующим образом:
* Контроллер родительского контроля (PageViewController) *
@interface MyParentPageViewController () <UIPageViewControllerDataSource>
@property (nonatomic, assign) NSUInteger currentPageIndex;
@end
@implementation MyParentPageViewController
- (void)viewDidLoad
{
[super viewDidLoad];
MyChildViewController *rootChildViewController = [MyChildViewController controllerWithPageIndex:self.currentPageIndex];
[self setViewControllers:@[rootChildViewController]
direction:UIPageViewControllerNavigationDirectionForward
animated:YES completion:nil];
self.dataSource = self;
}
#pragma mark - Page View Controller DataSource
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController
viewControllerAfterViewController:(MyChildViewController *)viewController
{
if (viewController.pageIndex == self.sourceArray.count - 1) {
return nil;
}
MyChildViewController *vc = [MyChildViewController controllerWithPageIndex:viewController.pageIndex + 1];
return vc;
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController
viewControllerBeforeViewController:(CHHomeDetailTableController *)viewController
{
if (viewController.pageIndex == 0) {
return nil;
}
MyChilViewController *vc = [MyChildViewController controllerWithPageIndex:viewController.pageIndex - 1];
return vc;
}
@end
* Контроллер детского просмотра *
@implementation MyChildViewController
- (void)viewWillAppear
{
MyParentPageViewController *parentPageViewController = (MyParentPageViewController *)self.parentViewController;
parentViewController.currentPageIndex = self.pageIndex;
}
@end
Например, parentPageViewController currentPageIndex равен 10 или некоторым другим значениям, когда ваш swipe right, parentViewController.currentPageIndex будет равен 9, если 0, ничего не произошло; Если вы проведите пальцем влево, parentPageViewController.currentPageIndex будет равен 11, если показ controller.view является последним, ничего не произошло.
Вы можете попробовать это. Это даст вам текущую страницу.
- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
{
UIViewController * viewController = [previousViewControllers lastObject];
NSUInteger previousPage = [(PageContentViewController *)viewController index];
NSUInteger currentPage = previousPage+1;
}
Чтобы получить текущий индекс, вам нужно будет сделать следующее:
-(void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed {
NSUInteger index = [self.viewControllers indexOfObject: [pageViewController.viewControllers lastObject]];
NSLog(@"INDEX: %lu",(unsigned long)index);
}
Вот как я определяю текущий индекс страницы, будет ли пользователь перемещаться влево или вправо, и изменит ли он свой жест направления движения в середине прокрутки. Просто убедитесь, что у вас есть свойство pageIndex в вашем контроллере просмотра для хранения индекса:
func pageViewController(pageViewController: UIPageViewController, willTransitionToViewControllers pendingViewControllers: [UIViewController]) {
let currentPageIndex = (pendingViewControllers.last! as! ViewController).pageIndex!
}
Нет никакого хорошего способа сделать это, но я считаю, что самым надежным способом является наблюдение за вызовами UIPageViewControllerDelegate
:
var index: Int
var proposedViewController: UIViewController?
// MARK: UIPageViewControllerDelegate
func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
guard let proposedViewController = proposedViewController,
let index = myViewControllers?.index(of: proposedViewController) else {
return
}
self.index = index
}
func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) {
guard pendingViewControllers.count == 1,
let proposedViewController = pendingViewControllers.first else {
return
}
self.proposedViewController = proposedViewController
}