Question

Mon application qui contient un UITableViewController intégré dans UIPageViewController déclenche cette exception de temps en temps :

Invalid parameter not satisfying: [views count] == 3

Retour en arrière :

* thread #1: tid = 0x6239fa, 0x03d1d88a libobjc.A.dylib`objc_exception_throw, queue = 'com.apple.main-thread, stop reason = breakpoint 25.3
    frame #0: 0x03d1d88a libobjc.A.dylib`objc_exception_throw
    frame #1: 0x0404f448 CoreFoundation`+[NSException raise:format:arguments:] + 136
    frame #2: 0x03428fee Foundation`-[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 116
    frame #3: 0x01e7c535 UIKit`-[_UIQueuingScrollView _replaceViews:updatingContents:adjustContentInsets:animated:] + 185
    frame #4: 0x01e800ca UIKit`-[_UIQueuingScrollView _didScrollWithAnimation:force:] + 1231
    frame #5: 0x01e7bb57 UIKit`-[_UIQueuingScrollView _scrollViewAnimationEnded:finished:] + 104
    frame #6: 0x0190583c UIKit`-[UIScrollView(UIScrollViewInternal) animator:stopAnimation:fraction:] + 62
    frame #7: 0x0197096e UIKit`-[UIAnimator stopAnimation:] + 533
    frame #8: 0x0197100a UIKit`-[UIAnimator(Static) _advanceAnimationsOfType:withTimestamp:] + 325
    frame #9: 0x01970b76 UIKit`-[UIAnimator(Static) _LCDHeartbeatCallback:] + 67
    frame #10: 0x01663b8a QuartzCore`CA::Display::DisplayLinkItem::dispatch() + 48
    frame #11: 0x01663a46 QuartzCore`CA::Display::DisplayLink::dispatch_items(unsigned long long, unsigned long long, unsigned long long) + 310
    frame #12: 0x01663f6b QuartzCore`CA::Display::TimerDisplayLink::callback(__CFRunLoopTimer*, void*) + 123
    frame #13: 0x0400dbd6 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 22
    frame #14: 0x0400d5bd CoreFoundation`__CFRunLoopDoTimer + 1181
    frame #15: 0x03ff5628 CoreFoundation`__CFRunLoopRun + 1816
    frame #16: 0x03ff4ac3 CoreFoundation`CFRunLoopRunSpecific + 467
    frame #17: 0x03ff48db CoreFoundation`CFRunLoopRunInMode + 123
    frame #18: 0x0533b9e2 GraphicsServices`GSEventRunModal + 192
    frame #19: 0x0533b809 GraphicsServices`GSEventRun + 104
    frame #20: 0x01874d3b UIKit`UIApplicationMain + 1225

Est-ce que quelqu'un a déjà vu cela ou a une idée de la raison ?

Était-ce utile?

La solution

Edit: Après avoir utilisé ce correctif pendant plus de temps, je peux toujours voir le bogue à l'occasion, ce n'est pas la solution complète (eh bien ... c'était toujours une sorte de hack).Je vais mettre à jour avec la solution réelle une fois que je le trouverai.


J'ai rencontré cette même erreur en utilisant UipageViewController.Après les heures de débogage de la question, j'ai trouvé que la cause utilisait UIView Animations à l'intérieur du gestionnaire d'achèvement de UIPAGEVIEWCONTROLLER ''S SETVIEVOLLES: Direction: Animée: Achèvement :.

Je ne sais pas pourquoi l'animation à ce stade provoque l'erreur d'affirmation (je n'élanais pas l'UIPAGEVIEWCONTROLLER ou ses contrôleurs d'affichage de votre enfant), mais enveloppez le bloc de code avec DisPatch_ASync sur la file d'attente principale résolvant le problème et arrêtez le problème..

Autres conseils

J'ai vu ce crash lorsque vous essayez de transmettre par programme à une nouvelle page.Une réponse qui m'a senti logiciel est de ne pas leur permettre de toucher la page de page pendant la transition.

__block UIView *pageView = pageViewController.view;

// Disable page view to not allow the user to interrupt the page view animation and cause crash
pageView.userInteractionEnabled = NO;

[pageViewController setViewControllers:@[viewController] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:^(BOOL finished) {
    if (finished) {
        pageView.userInteractionEnabled = YES; // re-enable
    }
}];

Assurez-vous simplement que vous ne faites aucune animation dans la vie ViewDidAppear dans le contrôleur que vous retournez.Ou si vous devez le faire après un délai une fois que la vue est apparue.

J'utilise UipageViewController avec des points.Après que l'utilisateur s'échappe sur les points, le délégué didfinanimant a été appelé et je déclenche une autre animation, puis il se bloque.Mais cela ne se produit que lorsque l'utilisateur passe sur les points.

- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray<UIViewController *> *)previousViewControllers transitionCompleted:(BOOL)completed
{
    if (completed && finished)
    {
        dispatch_async(dispatch_get_main_queue(), ^{
            [self animateSomeView];
        })
    }
}

J'ai rencontré la même erreur avec un UIViewController que j'avais intégré dans un UIPageViewController.Dans mon cas, j'ai réalisé que mon contrôleur enfant avait remplacé viewWillAppear et viewDidAppear sans appeler super.Bien que je ne puisse que deviner les détails, il est logique que cela puisse gâcher la gestion des vues.Ajout du super les appels ont fait disparaître le problème.

Dans mon cas, le problème était la mise en œuvre de UIPageViewControllerDelegate:

Je mets à jour les contraintes danspageViewController(_ pageViewController:, didFinishAnimating:, previousViewControllers:, transitionCompleted:)

dispatch_async sur la file d'attente principale, résolvez ce problème

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top