استثناء المعلمة غير صالح القيت من قبل _ويوينغسكرولفيو
-
20-12-2019 - |
سؤال
بلدي التطبيق الذي يحتوي على إيتابليفيوكونترولر جزءا لا يتجزأ من إيباجيفيوكونترولر يثير هذا الاستثناء من وقت لآخر:
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 داخل معالج إكمال SetViewControllers: الاتجاه: الرسوم المتحركة: الانتهاء:.
لا أعرف لماذا يتسبب الرسوم المتحركة في تلك المرحلة من خطأ التأكيد (لم أكن أرفق uipageviewcontroller أو لوحات تحكم عرض الأطفال الخاصة به)، ولكن التفاف كتلة التعليمات البرمجية مع dispatch_async على قائمة الانتظار الرئيسية يحل المشكلة وإيقاف التعطل.
نصائح أخرى
رأيت هذا التعطل عند محاولة الانتقال برمجيا إلى صفحة جديدة.إجابة ذات معنى بالنسبة لي هي عدم السماح لهم باللمس طريقة عرض الصفحة أثناء الانتقال.
giveacodicetagpre.فقط تأكد من أنك لا تقوم بأي رسوم متحركة داخل ViewDidAppear في وحدة التحكم التي تعود إليها.أو إذا كان عليك القيام بذلك بعد بعض التأخير بمجرد ظهر العرض.
يمكنني استخدام uipageviewcontroller مع النقاط.بعد أن يدافع المستخدم على النقاط، دعا المفوض DidFinishAnimating وتشغيل الرسوم المتحركة الأخرى، ثم تعطل.لكنه يحدث فقط عندما يزداد المستخدم على النقاط.
giveacodicetagpre.واجهت نفس الخطأ مع إيفيوكونترولر كنت قد جزءا لا يتجزأ من إيباجيفيوكونترولر.في حالتي ، أدركت أن وحدة تحكم طفلي قد تجاوزت viewWillAppear
و viewDidAppear
دون الاتصال من خلال super
.على الرغم من أنني لا أستطيع إلا أن أخمن التفاصيل ، فمن المنطقي أن القيام بذلك قد يفسد إدارة العرض.إضافة super
المكالمات في جعل المشكلة تختفي.
في حالتي كانت المشكلة في تنفيذ UIPageViewControllerDelegate
:
أقوم بتحديث القيود في
pageViewController(_ pageViewController:, didFinishAnimating:, previousViewControllers:, transitionCompleted:)
dispatch_async
في قائمة الانتظار الرئيسية حل هذه المشكلة