Ошибка утверждения в [MyClass layoutSublayersOfLayer:]
Я использую AutoLayout в подклассе UITextField, но иногда я получаю следующую ошибку /stacktrace:
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Auto Layout still required after executing -layoutSubviews. KOAOneDigitTextField implementation of -layoutSubviews needs to call super.'
*** First throw call stack:
(
0 CoreFoundation 0x0390d1e4 __exceptionPreprocess + 180
1 libobjc.A.dylib 0x034c08e5 objc_exception_throw + 44
2 CoreFoundation 0x0390d048 +[NSException raise:format:arguments:] + 136
3 Foundation 0x0167e4de -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 116
4 UIKit 0x02615a38 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 567
5 libobjc.A.dylib 0x034d282b -[NSObject performSelector:withObject:] + 70
6 QuartzCore 0x01caf45a -[CALayer layoutSublayers] + 148
7 QuartzCore 0x01ca3244 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 380
8 QuartzCore 0x01ca30b0 _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 26
9 QuartzCore 0x01c097fa _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 294
10 QuartzCore 0x01c0ab85 _ZN2CA11Transaction6commitEv + 393
11 QuartzCore 0x01cc85b0 +[CATransaction flush] + 52
12 UIKit 0x025a49bb _UIApplicationHandleEventQueue + 13095
13 CoreFoundation 0x0389677f __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
14 CoreFoundation 0x0389610b __CFRunLoopDoSources0 + 235
15 CoreFoundation 0x038b31ae __CFRunLoopRun + 910
16 CoreFoundation 0x038b29d3 CFRunLoopRunSpecific + 467
17 CoreFoundation 0x038b27eb CFRunLoopRunInMode + 123
18 GraphicsServices 0x0530c5ee GSEventRunModal + 192
19 GraphicsServices 0x0530c42b GSEventRun + 104
20 UIKit 0x025a6f9b UIApplicationMain + 1225
21 MyProject 0x0006e94d main + 141
22 libdyld.dylib 0x03e86701 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
Что мне не хватает?
Ответы
Ответ 1
У меня была аналогичная проблема с пользовательским представлением, и оказалось, что один из моих пользовательских родительских классов переопределял -layoutSubviews
и вызывал super
, только сначала вызывал super
вместо последнего. Для меня было исправлено, что все переопределения -layoutSubviews
в моем проекте имеют форму:
- (void)layoutSubviews {
// Custom code which potentially messes with constraints
[super layoutSubviews]; // No code after this and this is called last
}
Ответ 2
Я только начинал испытывать эту проблему неожиданно, на двух VC, которые работали нормально.
Выключается, добавив
[self.view layoutIfNeeded];
поскольку последняя строка метода viewDidLayoutSubviews на моем VC исправила его для меня.
Я понятия не имею, почему это сработало или почему это началось с самого начала, но большая часть нашего тестирования против iOS 8, и поскольку мы работали над проблемами, запущенными до 7, это произошло.
Не удалось найти решение, которое сработало для этой конкретной проблемы, поэтому, надеюсь, это поможет кому-то другому!