对类似问题的回答没有帮助,所以我打开了一个新问题。
我现在在我的几个项目中遇到了这个问题:
点击第一个响应者UITextField
或UITextView
(通常会显示默认的上下文菜单进行复制和粘贴)会导致我的应用崩溃。
注意: UICalloutBarButton
是一个UIKit
私有API,因此无法更改其layoutSubviews
实施并在其中调用[super layoutSubviews]
记录消息:
*** Assertion failure in -[UICalloutBarButton layoutSublayersOfLayer:], /SourceCache/UIKit_Sim/UIKit-2935.137/UIView.m:8794
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Auto Layout still required after executing -layoutSubviews. UICalloutBarButton's implementation of -layoutSubviews needs to call super.'
我不知道为什么会出现这种情况。对任何帮助都会非常高兴。
修改
尝试在演示项目中重现崩溃,我发现它是一个导致崩溃的自定义UIView
类别。有关更多详细信息,请参阅已接受的答案。
答案 0 :(得分:1)
通过尝试在演示项目中重现崩溃,我发现它是一个导致崩溃的自定义UIView类别。
创建此错误时,我认为类别方法仅适用于UIView
此类别的#import
子类。
您在 a 类别中声明的任何 方法都可用于所有实例原始类,以及原始类的任何子类。在运行时,类别添加的方法与原始类实现的方法没有区别。
所以没有意识到这一点,我在我的自定义类别中覆盖了UIView
方法+ (BOOL) requiresConstraintBasedLayout
以返回YES
(就像我错误地认为那些导入此类别的类一样)
在该方法中设置断点,我了解到,一旦将类别文件添加到项目中,就会从UIKit中的无处不在调用此 category-method 。
除了一种痛苦的学习/接受方式之外,类别中的首要方法是从不一个好主意 - 除非你想引起像这样的奇怪崩溃; - )。
很抱歉偷了你的时间,但是谢谢你提出一些代码示例,这些例子迫使我认真地重现了这个问题 - 这导致我崩溃的原因......