2013-07-20 2 views
24

Я боролся с этой проблемой в течение последних нескольких дней, и после всего этого жонглирования я понял, что все, что мне нужно, это текущий индекс из метода источника данных для обновления с текущим номером видимой страницыUIPageViewController: получить currentPage

у меня есть этот метод UIPageViewController и источника данных нужно использовать текущий индекс, чтобы получить текущую видимую страницу для метода делегата 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; 
} 

Как исправить это?

ответ

26

Похоже, что вы должны быть в состоянии получить текущий индекс с:

ContentViewController *viewController = [self.pageViewController.viewControllers lastObject]; 
currentIndex = [modelArray indexOfObject:[viewController page]]; 
+0

я написал это так, но получение Идентификатор вопроса синтаксического анализа currentIndex = [modelArray indexOfObject: [ContentViewController *) viewController page]]; – user1120133

+0

Отсутствует вложенный фрагмент. '(' in the cast. – Wain

+0

не работает, но пробовал этот currentIndex = contentViewController.page, но получал 1 из 20, а при повороте страницы за показом 128393777 из 20 – user1120133

4

Реализовать Делегирование метод

- (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

+3

Я не знаю, кто это поддержал, но я не думаю, что это правильное решение. Что мне делать в моем случае, потому что у меня 12 страниц, и я загружаю один и тот же контроллер представления с разными данными. –

+0

Ответ отрицательный – Bannings

+0

Эй, вы можете использовать тег для дифференцирования контроллера вида. – avi

8

если вы реализуете 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]; 
} 
+0

Однако обратите внимание ... http://stackoverflow.com/a/15956176/294884 – Fattie

1

Вы можете попробовать это. Это даст вам текущую страницу.

- (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; 
} 
+0

Когда пользователь отскакивает назад, это увеличит текущую страницу, t – jaytrixz

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); 

} 
20

для быстро:

func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool){ 
     let pageContentViewController = pageViewController.viewControllers![0] as! ViewController 
     let index = pageContentViewController.pageIndex 

} 
+0

Прохладный раствор. Работает в любой ситуации. Можете ли вы объяснить вторую строчку кода? –

+3

Когда пользователь отскакивает назад, у вас не будет текущего индекса – jaytrixz

2

Я боролся с этим тоже, и ни один из других решений не работал для меня, но, наконец, смог его решить, используя делегатский метод:

Первый в 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.м реализовать метод делегата

#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 
} 
0

Это, как я могу определить текущий индекс страницы ли пользователь удары влево или вправо и изменяет ли он направление движения в середине прокрутки. Просто убедитесь, что у вас есть свойство pageIndex в вашем контроллере представления для хранения индекса:

func pageViewController(pageViewController: UIPageViewController, willTransitionToViewControllers pendingViewControllers: [UIViewController]) { 
     let currentPageIndex = (pendingViewControllers.last! as! ViewController).pageIndex! 
    } 
2

Я решил эту проблему так:

* Родитель View Controller (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 

* Ребенок View Controller *

@implementation MyChildViewController 
- (void)viewWillAppear 
{ 
    MyParentPageViewController *parentPageViewController = (MyParentPageViewController *)self.parentViewController; 
    parentViewController.currentPageIndex = self.pageIndex; 
} 
@end 

Например, currentPageIndex parentPageViewController имеет значение 10 или некоторые другие значения, когда ваш swipe right, parentViewController.currentPageIndex будет равен 9, если 0, ничего не произошло; Если вы проведите пальцем влево, parentPageViewController.currentPageIndex будет равен 11, если показ controller.view является последним, ничего не произошло.

4

Я столкнулся с той же проблемой на странице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. My PageContentViewController class looks like this

Запустите проект, и если все будет работать нормально, вы получите свое значение индекса. PageIndex - значение Integer для получения текущего индекса. Надеюсь, это поможет вам.

Благодаря

Mandeep Singh

0

Там не хороший способ сделать это, но я думаю, что самый надежный способ наблюдать 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 
} 
Смежные вопросы