点击UITextField或UITextView时出现崩溃:断言失败 - [UICalloutBarButton layoutSublayersOfLayer:]

时间:2014-12-10 16:20:37

标签: ios objective-c uitextfield uikit uitextview

对类似问题的回答没有帮助,所以我打开了一个新问题。

我现在在我的几个项目中遇到了这个问题:

点击第一个响应者UITextFieldUITextView(通常会显示默认的上下文菜单进行复制和粘贴)会导致我的应用崩溃。

注意: 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类别。有关更多详细信息,请参阅已接受的答案。


1 个答案:

答案 0 :(得分:1)

通过尝试在演示项目中重现崩溃,我发现它是一个导致崩溃的自定义UIView类别。

创建此错误时,我认为类别方法仅适用于UIView此类别的#import子类。

Apple Documentation

中描述的情况并非如此
  

您在 a 类别中声明的任何 方法都可用于所有实例原始类,以及原始类的任何子类。在运行时,类别添加的方法与原始类实现的方法没有区别。

所以没有意识到这一点,我在我的自定义类别中覆盖了UIView方法+ (BOOL) requiresConstraintBasedLayout以返回YES(就像我错误地认为那些导入此类别的类一样)

在该方法中设置断点,我了解到,一旦将类别文件添加到项目中,就会从UIKit中的无处不在调用此 category-method

除了一种痛苦的学习/接受方式之外,类别中的首要方法是从不一个好主意 - 除非你想引起像这样的奇怪崩溃; - )。

很抱歉偷了你的时间,但是谢谢你提出一些代码示例,这些例子迫使我认真地重现了这个问题 - 这导致我崩溃的原因......