2012-10-08 15 views
5

Gdy użytkownik znajduje się na pierwszej stronie UIPageViewController i próbuje wrócić, po prostu zwracam zero. W iOS 5 działa to dobrze. Powoduje to awarię w systemie iOS 6.Jak ustawić pierwszą stronę w UIPageViewController

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'The number of view controllers provided (0) doesn't match the number required (1) for the requested transition' 

Oto mój kod. Po powrocie contentViewController zamiast nil, działa poprawnie. Co powinienem wstawić zamiast nil?

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

    contentViewController = [[ContentViewController_iPhone alloc] init]; 

    int currentIndex = [self.modelArray indexOfObject:[(ContentViewController_iPhone *)viewController labelContents]]; 

    if ((currentIndex == 0) || (currentIndex == NSNotFound)) { 

     //if on the first page, can't go back 
     return nil; 

    } 

    contentViewController.labelContents = [self.modelArray objectAtIndex:currentIndex - 1]; 

    return contentViewController; 

} 
+0

Czy możesz po prostu zwrócić 'self' zamiast' nil'? Jest to przypuszczenie z mojej strony. –

+0

@JoshuaSmith Próbowałem, ale nadal mam ten sam problem. W każdym razie dzięki. –

+0

Zwrócenie 'nil' jest dokładnie tym, jak szablon projektu" Szablon aplikacji "firmy Apple obsługuje pierwszą i ostatnią stronę. Myślę, że masz inny problem. Ustaw punkt przerwania wyjątku i opublikuj pełną ścieżkę stosu wyjątku. –

Odpowiedz

10

Miałem ten sam problem i okazało się, że dzieje się tak tylko, jeśli zmienię delegatów stronyv iewcontrollers gestureRecognizers do mojego własnego kontrolera (odbywa się to często, jeśli chcesz anulować stronicowanie, gdy użytkownik dotknie pewnych obszarów na stronie, np. , np. przyciski).

Dla mnie to działało, aby nie wykonywać tego ponownego przypisywania dla iOS 6. Jest to w porządku, ponieważ iOS obsługuje dotknięcia trochę inaczej. Przyciski lub własne identyfikatory gestów na stronie będą działać prawidłowo w systemie iOS 6, ponieważ mają priorytet i automatycznie anulują stronicowanie.

Mam nadzieję, że to pomoże.

+0

Spróbuję tego później. Powiedziałeś, że przyciski i moje własne rozpoznawanie gestów będą miały pierwszeństwo w iOS 6 ... czy jest to również zmiana z iOS 5? Dzięki. –

+0

@Jack: tak, myślę, że to jest zmiana (i powód, dla którego uważam, że stare podejście nie jest już potrzebne w większości przypadków) –

+0

Właśnie miałem okazję wypróbować tego i zadziałało. Dzięki! –

0

Trzeba dodać następujący kod

if (currentIndex == 0 || (index == NSNotFound)) { 

    //if on the first page, can't go back 
    return nil; 

} 
+0

Niestety, to nie zadziałało. Nadal się zawiesza. Powrót 'nil' jest problemem. Z jakiegoś powodu nie podoba mu się to. Instrukcja if nie musi być zmieniana. –

+0

Czy umieścisz punkt zerowy na zero i sprawdzasz, czy nawet wchodzi do tego bloku? –

+0

To jest, użyłem wcześniej 'NSLog' i wypuściło jego zawartość. Ponownie, wszystko to działa dobrze w iOS 5. To jest iOS 6, który powoduje problemy. –

0

najnowsza wersja Xcode strony opartej Aplikacja szablon przewiduje następujący kod:

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController 
{ 
    NSUInteger index = [self indexOfViewController:(DataViewController *)viewController]; 
    if ((index == 0) || (index == NSNotFound)) { 
    return nil; 
} 

index--; 
return [self viewControllerAtIndex:index storyboard:viewController.storyboard]; 
} 

To powinno załatwić sprawę: -)

+0

Dzięki, ale to nie zadziałało. Zwrócenie 'nil' powoduje problem. Kiedy zwracam wartość inną niż 'nil', działa dobrze. Jak powstrzymać go przed przechodzeniem na stronę przed pierwszą stroną, jeśli zero nie działa? –

Powiązane problemy