2013-04-24 16 views
5

Chcę śledzić indeks, korzystając z UIPageViewController. Ilekroć przeciągam, muszę index++ lub index--. Ta metoda jest wywoływana, gdy delegat swipe wstecz lub dalej:Kontrola UIPageViewController podczas przesuwania do tyłu lub do przodu

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

Jak mogę sprawdzić w ten sposób, jeśli użytkownik przeciągnął wstecz lub dalej? Wiem, że istnieją 2 metody DataSource "viewControllerAfterViewController" i "viewControllerBeforeViewController", ale nie mogę sprawdzić, czy przejście strony zostało zakończone (i mogę to zrobić w powyższej metodzie) każdy pomysł, jak mogę wiedzieć, czy użytkownik przeciągnął z powrotem lub dalej powyższa metoda?

Odpowiedz

3

Zgodnie z documentation wydaje się, że nie ma sposobu na stwierdzenie, czy użytkownik przesuwał stronę w przód lub w tył. Boolean "finished" powie Ci, czy użytkownik ukończył kolejkę strony.

Obejście:

Utwórz int zmienna i używanie viewControllerAfterViewController i viewControllerBeforeViewController metod albo zwiększyć lub zmniejszyć wartość zmiennej. Użyj tego, aby sprawdzić, czy poruszają się do przodu czy do tyłu.

Edit: Można użyć presentationIndexForPageViewController z documentation

Edit 2: Sprawdź ten link here Jest to metoda o nazwie setViewControllers:direction:animated:completion: kierunek będzie albo UIPageViewControllerNavigationDirectionForward lub UIPageViewControllerNavigationDirectionReverse

edit 3: Code - Jest to przy założeniu, wiesz, który kontroler widoku zostanie wywołany, przechodząc do przodu lub do tyłu:

Utwórz zmienną w swojej aplikacjiDelegate i metoda setera:

int indexVar; 

- (void)setIndex:(int)indexVar; 

Następnie na Pana zdaniem kontrolerów (w przód lub w tył) albo zwiększenia wartości lub zmniejszyć wartość (viewDidLoad):

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

coś wzdłuż tych linii. Nie będzie to dokładny sposób na osiągnięcie celu, ale mam nadzieję, że doprowadzi cię to we właściwym kierunku.

+0

Problem polega na tym, że nie mogę śledzić indeksu w tych 2 funkcjach ... Ponieważ nie mogę sprawdzić, czy przejście zostało zakończone, jeśli nie zostało ukończone, indeks nie musi zwiększać ani zmniejsz (jeśli złapiesz stronę, ale nie przekręcisz jej na następną stronę) – nonuma

+1

Edytowałem swoją odpowiedź, aby odzwierciedlić Twoje komentarze. Element prezentacjaIndeks nie zmieni się ani nie będzie, dopóki użytkownik nie przejdzie do przodu lub wstecz. – Jordan

+0

A jak korzystać z tej metody? Czy możesz dać mi mały przykład jak indeksować ++ i indeksować? – nonuma

4

stosowanie protokołu:

MyClass : UIViewController <UIPageViewControllerDataSource,UIPageViewControllerDelegate 

zadeklarować ATUTY:

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

oraz w metodach:

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

tam będziesz mieć bieżącą stronę. Dzięki Corey Floyd w enter link description here

+0

'nextIndex' powinno być równe' currentIndex + 1'. W 'didFinishAnimating', sprawdź nowy' currentIndex == nextIndex', przesuń palcem w lewo, w przeciwnym razie – huync

+0

w ten sposób działa dobrze! –

0

Zrobiłem to, tworząc protokoły w każdej z moich klas ViewController, z metodą protokołu wywołaną w metodzie viewWillAppear. Następnie za pomocą narzędzia PageViewController za każdym razem, gdy tworzę egzemplarz kontrolera widoku, ustawiam go jako kontroler PageViewController. Jest to 3. ViewController w moim projekcie (Zauważ, że zrobiłem to w każdym moim zdaniem kontrolerów)

@class ViewController3; 
@protocol ViewControllerPageNumber <NSObject> 

-(void)viewWillAppearMyPageNumber:(int)myPageNumber; 

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

iw pliku .m w metodzie viewWillAppear

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

Dalej, na stronie PageViewController.m, gdy tylko tworzę instancję kontrolera widoku, ustawiam delegata na self (lub PageViewController). viewCons to po prostu tablica łańcuchów z moimi nazwami 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; 
} 

Wreszcie, mam zwyczaj wykonawczych moją metodę delegata, który w moim przypadku jest to tekst orzeźwiający etykietach Mam ustawiony na szczycie PageViewController.

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

Myślę, że najprostszym rozwiązaniem jest, aby stworzyć własną klasę ViewController z majątku, który śledzi aktualnie pokazanym indeksie. W większości przypadków potrzebuję niestandardowego ViewController dla mojego PageViewController tak czy inaczej. W moim przykładzie jest to następująca klasa.

@interface PageZoomViewController : UIViewController 

@property (nonatomic) int pageIndex; 

@end 

Następnie w metodach viewControllerAfter/Before można przekazać indeks do nowej strony.

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

Po zakończeniu animacji dla następnej strony można łatwo ustawić bieżący indeks w ten sposób.

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

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

Mam nadzieję, że to pomoże!

Powiązane problemy