Eccezione dei parametri non validi lanciata da _uiqueuingscrollview
-
20-12-2019 - |
Domanda
La mia app che contiene un'intesavevisioneController incorporata in Uipageviewcontroller solleva questa eccezione da volta in volta:
Invalid parameter not satisfying: [views count] == 3
.
Backtrace:
* 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
.
Qualcuno ha visto questo già o avere un'idea di quale motivo potrebbe essere?
Soluzione
Modifica: Dopo aver usato questa correzione per più tempo, posso ancora vedere il bug in occasione quindi questa non è la correzione completa (beh ... è sempre stato un po 'di hack).Aggiornerò con la soluzione effettiva una volta lo troverò.
.
Ho riscontrato questo stesso errore usando UipageViewColler.Dopo le ore di debug del problema, ho trovato la causa utilizzando UIView Animazioni all'interno del gestore di completamento di SetviewControllers di UipageViewController: Direzione: Animated: Completamento :.
Non so perché animare in quella fase provoca l'errore di asserzione (non stavo animando l'UipageViewController o i suoi controllori di visualizzazione dei figli), ma avvolgendo il blocco di codice con Dispatch_Async sulla coda principale risolve il problema e interrompono l'arresto anomalo.
Altri suggerimenti
Ho visto questo incidente quando cerca di passare a livello di programmazione a una nuova pagina.Una risposta che ha senso per me è non consentire loro di toccare la vista della pagina durante la transizione.
__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
}
}];
. Assicurati di non aver effettuato alcuna animazione all'interno di ViewDidaPappear nel controller a cui torni.O se devi farlo dopo un ritardo una volta che la vista è apparsa.
Io uso UpageViewColler con punti.Dopo che l'utente scorre sui punti, il delegato DidFinishanimating viene chiamato e attivo un'altra animazione, allora si blocca.Ma succede solo quando l'utente scorre sui punti.
- (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];
})
}
}
. Ho riscontrato lo stesso errore con un UIViewController che avevo incorporato in un UipageViewController.Nel mio caso, mi sono reso conto che il mio controllore del bambino aveva sovrascritto viewWillAppear
e viewDidAppear
senza chiamare fino a super
.Sebbene io possa solo indovinare i dettagli, ha senso che lo fare potesse rovinare la gestione della vista.Aggiungere le chiamate super
in rese il problema, andare via.
Nel mio caso il problema era in implementazione di UIPageViewControllerDelegate
:
I Aggiorna i vincoli in
pageViewController(_ pageViewController:, didFinishAnimating:, previousViewControllers:, transitionCompleted:)
dispatch_async
sulla coda principale Risolvi questo problema