2013-04-24 2 views
5

Я хочу отслеживать индекс, используя UIPageViewController. Всякий раз, когда я сажусь, мне нужно index++ или index--. Этот метод делегата вызывается всякий раз, когда вы проводите назад или дальше:Проверка UIPageViewController при прокрутке назад или вперед

- (void)pageViewController:(UIPageViewController *)pvc didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed 
{ 
    // If the page did not turn 
    if (!completed) 
    { 
     // You do nothing because whatever page you thought 
     // the book was on before the gesture started is still the correct page 
     return; 
    } 

    // I want to check here whenever the page was swiped back or further 
} 

Как проверить в этом методе, если пользователь наотмашь назад или дальше? Я знаю, что есть 2 метода DataSource «viewControllerAfterViewController» и «viewControllerBeforeViewController», но я не могу проверить, завершился ли переход на страницу (и я могу сделать это в вышеуказанном методе) любую идею, как я мог бы знать, если пользователь отскакивает назад или дальше в вышеупомянутый метод?

ответ

3

В соответствии с documentation, похоже, нет способа определить, прошел ли пользователь прокрутку страницы вперед или назад. Логическое «завершено» сообщит вам, завершил ли пользователь завершение страницы.

Обходной:

Создать INT переменной и с использованием методов viewControllerAfterViewController и viewControllerBeforeViewController либо увеличивать или уменьшать значение переменной. Используйте это, чтобы проверить, перемещены ли они вперед или назад.

Edit: Вы можете использовать presentationIndexForPageViewController из documentation

Edit 2: Проверить эту ссылку here Существует метод назван setViewControllers:direction:animated:completion: направление будет либо UIPageViewControllerNavigationDirectionForward или UIPageViewControllerNavigationDirectionReverse

Редактировать 3: Code - Это при условии, вы знаете, какой контроллер будет вызываться либо вперед, либо назад:

Создайте переменную на вашем приложении appDelegate и методе сеттера:

int indexVar; 

- (void)setIndex:(int)indexVar; 

Тогда на контроллерах зрения (вперед или назад) или увеличить значение или уменьшить значение (viewDidLoad):

(AppDelegate *)[[UIApplication sharedApplication] delegate] setIndex:<whatever>]; 

Что-то вдоль этих линий. Это не будет точным способом достижения вашей цели, но, надеюсь, он заставит вас идти в правильном направлении.

+0

Проблема в том, что я не могу отслеживать индекс в этих двух функциях ... Поскольку я не могу проверить, завершен ли переход, если он не был завершен, индекс не нужно увеличивать или уменьшение (если вы заберете страницу, но не переверните ее на следующую страницу) – nonuma

+1

Я отредактировал свой ответ, чтобы отразить ваши комментарии. ПрезентацияIndex не будет изменяться вверх или вниз, если пользователь не переместится вперед или назад. – Jordan

+0

И как я могу использовать этот метод? Можете ли вы дать мне небольшой пример того, как я индексирую ++ и индекс ...? – nonuma

4

использование протокола:

MyClass : UIViewController <UIPageViewControllerDataSource,UIPageViewControllerDelegate 

объявляет atributes:

@property(nonatomic) NSInteger currentIndex; 
@property(nonatomic) NSInteger nextIndex; 

и в методах:

-(void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers{ 
    NewsTableViewController *controller = [pendingViewControllers firstObject]; 
    self.nextIndex = [self.arrViews indexOfObject:controller]; 
} 

-(void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed{ 
    if (completed) { 
     self.currentIndex = self.nextIndex; 
    } 
    self.nextIndex = 0; 
} 

там вы будете иметь текущую страницу. Благодаря Corey Floyd в enter link description here

+0

'nextIndex' должно быть равно' currentIndex + 1'. В 'didFinishAnimating', проверьте новый' currentIndex == nextIndex', проведите влево влево, иначе правый – huync

+0

таким образом хорошо работайте! –

0

Я сделал это, создав протоколы в каждом из моих классов ViewController, используя метод протокола, называемый методом viewWillAppear. Затем в PageViewController всякий раз, когда я создаю экземпляр одного из контроллеров представления, я устанавливаю его делегат как PageViewController. Это третий ViewController в моем проекте (Обратите внимание, что я сделал это в каждом из моих контроллеров зрения)

@class ViewController3; 
@protocol ViewControllerPageNumber <NSObject> 

-(void)viewWillAppearMyPageNumber:(int)myPageNumber; 

@end 
@interface ViewController3 : UIViewController 
@property (nonatomic, weak) id <ViewControllerPageNumber> delegate; 
@end 

и в файле .m в методе viewWillAppear

-(void)viewWillAppear:(BOOL)animated{ 
    [self.delegate viewWillAppearMyPageNumber:3];//The 3 will be different for each ViewController 
} 

Далее в PageViewController.m, всякий раз, когда я создаю экземпляр контроллера представления, я устанавливаю его делегат как self (или PageViewController). viewCons - это всего лишь массив строк с именами viewControllers.

- (UIViewController *)viewControllerAtIndex:(NSUInteger)index { 
    id vc = [[NSClassFromString([viewCons objectAtIndex:index]) alloc] init]; 
    if([vc isMemberOfClass:[NSClassFromString(@"ViewController3") class]]){ 
     ViewController3 *vc3=(ViewController3 *) vc; 
     vc3.delegate=self; 
    }else if([vc isMemberOfClass:[NSClassFromString(@"ViewController2") class]]){ 
     ViewController2 *vc2=(ViewController2 *) vc; 
     vc2.delegate=self; 
    }else if([vc isMemberOfClass:[NSClassFromString(@"ViewController") class]]){ 
     ViewController *vc1=(ViewController *) vc; 
     vc1.delegate=self; 
    } 
    return vc; 
} 

Наконец, я реализую свой метод пользовательского делегата, который в моем случае это текст освежающих наклеек я поставил на вершине PageViewController.

-(void)viewWillAppearMyPageNumber:(int)myPageNumber{ 
    [self refreshLabelsOnCurrentPageWithIndex:myPageNumber]; 
} 
0

Я думаю, что самым простым решением является создание собственного класса ViewController со свойством, отслеживающим текущий показанный индекс. В большинстве случаев мне нужен пользовательский ViewController для моего PageViewController в любом случае. В моем примере это следующий класс.

@interface PageZoomViewController : UIViewController 

@property (nonatomic) int pageIndex; 

@end 

Затем в методах viewControllerAfter/Before вы можете передать индекс на новую страницу.

-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { 

    int nextPageIndex = ((PageZoomViewController *)viewController).pageIndex-1; 

    PageZoomViewController *controller = [[PageZoomViewController alloc] initWithPageViewControlParent:self andFrame:[self frameForPagingScrollView] andPageIndex:nextPageIndex]; 

    return controller; 
} 

Когда анимация для следующей страницы завершена, вы можете легко установить текущий индекс следующим образом.

-(void)pageViewController:(UIPageViewController *)thePageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed { 

    if(completed) { 
     index = ((PageZoomViewController *)thePageViewController.viewControllers[0]).pageIndex; 
    } 
} 

Надеюсь, это поможет!

Смежные вопросы