2014-09-09 12 views
34

podczas przełączania między kartami zbyt szybko w UIPageViewController App coraz awarię w liniiAssertion w UIPageViewController

[UIPageViewController queuingScrollView:didEndManualScroll:toRevealView:direction:animated:didFinish:didComplete:] 

z błędami błąd potwierdzenia i kończące aplikację spowodowane nieprzechwyconego wyjątku „NSInternalInconsistencyException”, powód: „Nie kontroler widoku zarządzania widoczny widok.

Error Log jak poniżej

*** Assertion failure in -[UIPageViewController queuingScrollView:didEndManualScroll:toRevealView:direction:animated:didFinish:didComplete:], /SourceCache/UIKit/UIKit-3318.0.1/UIPageViewController.m:1875 
2014-09-29 11:34:00.770 Wowcher[193:9460] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'No view controller managing visible view <UIView: 0x1783fa80; frame = (0 0; 320 416); autoresize = W+RM+H+BM; layer = <CALayer: 0x17898540>>' 
*** First throw call stack: 
(0x219fbf87 0x2f15ac77 0x219fbe5d 0x226cb2c9 0x253f9fff 0x2546f8d3 0x2546f6b7 0x2546c2b9 0x254700db 0x25470f97 0x2546d037 0x24ea925f 0x2500a589 0x24ff7eef 0x24ea677d 0x252b8c81 0x24e70105 0x24e6e07f 0x24ea4b6d 0x24ea443d 0x24e7acc5 0x250ee513 0x24e79707 0x219c2807 0x219c1c1b 0x219c0299 0x2190ddb1 0x2190dbc3 0x28c99051 0x24ed9a31 0xd950b 0xca6e0) 
libc++abi.dylib: terminating with uncaught exception of type NSException 

z góry dzięki

+0

przyjrzeć http://stackoverflow.com/questions/10576671/uipageviewcontroller-crashes-when-flipped-too- szybka w trakcie niskiej pamięci – Signo

+0

Sprawdziłem z linkiem referencyjnym, ale wciąż mam ten sam problem. – Brjv

Odpowiedz

1

Jest naprawdę dobra dyskusja tutaj:

Removing a view controller from UIPageViewController

Zaakceptowanych odpowiedź omawia to:

" Nie wiedząc dokładnie, dlaczego to było hap Pening, wycofałem się i ostatecznie zacząłem używać odpowiedzi Jai jako rozwiązania, tworząc całkowicie nowy UIPageViewController, pchając go na , a następnie wyskakując starego. Gross, ale działa - głównie. I zostały znalezieniem nadal jestem coraz okolicznościowe Błędy twierdzenie z UIPageViewController, jak ten: niewydolność

  • potwierdzenie w - [UIPageViewController queuingScrollView: didEndManualScroll: toRevealView: Kierunek: animowane: didFinish: didComplete:] /SourceCache/UIKit_Sim/UIKit-2380.17/UIPageViewController.m:1820 $ 1 = 154507824 Nie kontroler widoku zarządzania widoczny widok>

I awarii aplikacji. Czemu? Cóż, szukając, znalazłem to drugie pytanie, które wspominałem wyżej, a zwłaszcza zaakceptowaną odpowiedź, która opowiada się za moim pierwotnym pomysłem, po prostu wywołanie setViewControllers: animated:YES, a następnie, gdy tylko zakończy się wywoływanie setViewControllers: animated:NO z tymi samymi kontrolerami widoku, aby zresetować UIPageViewController, ale miał brakujący element: wywoływanie tego kodu z powrotem w głównej kolejce! Oto kod:.”

+0

Czy możesz wysłać swój przykładowy kod. – Brjv

+0

Spróbuję opracować przykład tego wieczoru w USA. Wyłączony do pracy właśnie teraz. –

+0

To rozwiązanie nie działa dla mnie :( – miljan

7

Jest to błąd w wewnętrznej implementacji UIPageViewController w trybie przewijania Zdarza się, kiedy pojawia się animacja przejścia, gdy kontroler widoku strona jest już animowanie przejścia Co skończyło się robi było zablokować. Interfejs użytkownika pozwala na wielokrotne szybkie przewijanie Mam dwa przyciski, lewy i prawy, które powodują, że kontroler widoku strony przewija do poprzedniego lub następnego kontrolera strony Wyłączam działanie przycisków podczas gdy pojawia się animacja Przedstawiciel kontrolera widoku strony mówi ci wszystko, co musisz wiedzieć, kiedy wyłączyć funkcjonalność interfejsu użytkownika i kiedy go ponownie włączyć, po zatrzymaniu wszystkich animacji

21

Więc moim rozwiązaniem było dodanie BOOL, które śledzi mój stan animacji. ing nowego ViewController, zmodyfikować to zbyt:

if (!_transitionInProgress) { 
      _transitionInProgress = YES; 
      [self.pageController setViewControllers:@[viewController] direction:UIPageViewControllerNavigationDirectionReverse animated:YES completion:^(BOOL finished) { 
       _transitionInProgress = !finished; 
      }]; 
     } 

Więc będę czekać na moja animacja, aby zakończyć przed ustawieniem nowego kontrolera widoku. W moim przypadku mam kilka przycisków, które użytkownik może nacisnąć, aby przełączyć strony.Zapobiega to także zbyt szybkiemu przechodzeniu przez nie, więc animacje są zawsze gładkie i ładne

+0

To działało dla mnie, pozwalam również użytkownikowi na przesuwanie po całym widoku, aby zmienić stronicowanie, więc dodałem to samo śledzenie stanu w 'UIPageViewControllerDelegate' metodach' willTransitionToViewControllers' i ' didFinishAnimating', aby zapobiec nakładającym się kliknięciom i przesunięciom – johnrechd

+0

Dobry połów !!!! –

2

Mam również do czynienia z tym problemem, ale problem polega na tym, że nie jestem w stanie konsekwentnie odtworzyć problemu, ale widzę z crashlogów że problem istnieje.

Mam przeglądarkę stron, która pozwala użytkownikowi na przesunięcie, a także programowo przewija widok. Aplikacja czasami się zawiesza, gdy tylko wchodzisz na ekran, ale przy następnych próbach działa dobrze, więc jest to szaleństwo. Nawet jeśli wprowadzę poprawkę, nie mogę mieć pewności, że działa, ponieważ nie jestem w stanie jej odtworzyć. Wygląda na to, że poniższy kod powinien go naprawić (wziął od Removing a view controller from UIPageViewController) co najmniej ekran zachowuje się lepiej z tym kodem. Byłbym bardzo wdzięczny, gdyby udało mi się uzyskać pewne metody samodzielnego wykonania tej awarii, aby zweryfikować poprawkę.

- (void) setViewControllers:(NSArray*)viewControllers direction:(UIPageViewControllerNavigationDirection)direction animated:(BOOL)animated completion:(void (^)(BOOL))completion { 

    if (!animated) { 
     [super setViewControllers:viewControllers direction:direction animated:NO completion:completion]; 
     return; 
    } 

    [super setViewControllers:viewControllers direction:direction animated:YES completion:^(BOOL finished){ 

     if (finished) { 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       [super setViewControllers:viewControllers direction:direction animated:NO completion:completion]; 
      }); 
     } else { 
      if (completion != NULL) { 
       completion(finished); 
      } 
     } 
    }]; 
} 
+0

Miał dość spójny crash (~ 80% czasu) - nie było po dodaniu tego –

1

Naprawiłem problem przez ustawienie edgesForExtendedLayout = UIRectEdgeNone na moim UIPageViewController podklasy:

- (instancetype)initWithTransitionStyle:(UIPageViewControllerTransitionStyle)style navigationOrientation:(UIPageViewControllerNavigationOrientation)navigationOrientation options:(NSDictionary<NSString *,id> *)options 
{ 
    self = [super initWithTransitionStyle:style navigationOrientation:navigationOrientation options:options]; 

    self.edgesForExtendedLayout = UIRectEdgeNone; 

    return self; 
} 
+1

nie działa dla mnie – massimobio

Powiązane problemy