문제

UIPageViewController에 포함된 UITableViewController가 포함된 내 앱에서 때때로 다음 예외가 발생합니다.

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

이미 이것을 본 사람이 있거나 그 이유가 무엇인지 아는 사람이 있습니까?

도움이 되었습니까?

해결책

편집 :이 수정을 사용한 후에는 더 많은 시간을 보낸 후에 나는 기회에 버그를 볼 수 있습니다. 그래서 이것은 완전한 수정이 아닙니다 (항상 해킹의 종류가있었습니다).실제 솔루션으로 업데이트하겠습니다.


UIPAGEVIEWVIEWCORTROLLER를 사용 하여이 동일한 오류가 발생했습니다.이 문제를 디버깅하는 데 시간을 디버깅하면 UIVAGEVIEWCONTROLLER의 SETVIEWCORTROLLERS의 완료 핸들러 내부에 UIView 애니메이션을 사용하는 것이있었습니다. 방향 : 애니메이션 : 완료 :.

해당 단계에서 애니메이팅이 어설 션 오류를 일으키는 이유를 알지 못합니다 (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
    }
}];
.

다시 돌아갈 컨트롤러의 ViewDidAppear에서 애니메이션을 수행하지 않는지 확인하십시오.또는보기가 나타나면 지연 후에 수행 해야하는 경우

UIPAGEVIEWCONTROLLER을 점으로 사용합니다.사용자가 도트에 스 와이프를 스 와이프 한 후에, 위임자가 호출되고 다른 애니메이션을 트리거하고 다른 애니메이션을 트리거합니다.그러나 사용자가 점을 스 와이프 할 때만 발생합니다.

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

UIPageViewController에 포함된 UIViewController에서 동일한 오류가 발생했습니다.내 경우에는 내 하위 컨트롤러가 재정의되었음을 깨달았습니다. viewWillAppear 그리고 viewDidAppear 전화를 걸지 않고 super.세부 사항은 추측만 할 수 있지만 그렇게 하면 뷰 관리가 엉망이 될 수 있다는 것은 당연합니다.추가 super 전화를 걸어 문제를 해결했습니다.

내 경우에는 문제가 구현에있었습니다. UIPageViewControllerDelegate:

제약 조건을 업데이트합니다.pageViewController(_ pageViewController:, didFinishAnimating:, previousViewControllers:, transitionCompleted:)

dispatch_async 메인 대기열에서 이 문제를 해결하세요

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top