Исключение недопустимого параметра, выданное _UIQueuingScrollView

StackOverflow https://stackoverflow.com//questions/20004310

Вопрос

Мое приложение, содержащее UITableViewController, встроенный в UIPageViewController, время от времени вызывает это исключение:

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

Обратная трассировка:

* 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

Кто-нибудь уже видел это или имеет представление, в чем может быть причина?

Это было полезно?

Решение

Редактировать: после использования этого исправления на большее время я все еще могу увидеть ошибку, так что это не полное исправление (ну ... это всегда было вроде взлома).Я буду обновлять с фактическим решением, как только я найду его.


Я столкнулся с этой же ошибкой, используя UipageViewController.После того, как рабочие отладки проблемы, я нашел, что причина использовала анимацию UIVIEW внутри обработчика UIPAGEViewController SetViewControllers: Направление: Animated: Завершение :.

Я не знаю, почему анимация на этой стадии вызывает ошибку утверждения (я не анимировал UipageViewController или его контроллеры дочернего представления), но обертывая блок кода с dispatch_async на основной очереди, решает проблему и остановить сбой,

Другие советы

Я видел этот крах при попытке программного перехода на новую страницу.Ответ, который имел смысл для меня - не позволить им коснуться просмотра страницы во время перехода.

__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
    }
}];
.

Просто убедитесь, что вы не делаете никаких анимаций в ViewDiDiDAppear в контроллере, к которому вы возвращаетесь.Или если вы должны сделать это после некоторой задержки после появления представления.

Я использую UipageViewController с точками.После того, как пользовательские проводники на точках, делегат Difinishanimation вызван, и я вызывающую другую анимацию, то он сбивает.Но это происходит только тогда, когда пользователь проводит на точки.

- (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];
        })
    }
}
.

Я столкнулся с той же ошибкой с UIViewController, который я встроил в UIPageViewController.В моем случае я понял, что мой дочерний контроллер переопределил viewWillAppear и viewDidAppear не дозваниваясь до super.Хотя я могу только догадываться о деталях, вполне логично, что это может испортить управление представлениями.Добавление super Звонки помогли решить проблему.

В моем случае проблема заключалась в реализации UIPageViewControllerDelegate:

Я обновляю ограничения вpageViewController(_ pageViewController:, didFinishAnimating:, previousViewControllers:, transitionCompleted:)

dispatch_async в основной очереди решить эту проблему

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top