【问题标题】:Crash when tapping on UITextField or UITextView: Assertion failure in -[UICalloutBarButton layoutSublayersOfLayer:]点击 UITextField 或 UITextView 时崩溃:-[UICalloutBarButton layoutSublayersOfLayer:] 中的断言失败
【发布时间】:2014-12-10 16:20:36
【问题描述】:

对类似问题的回答没有帮助,所以我要提出一个新问题。

我现在的几个项目中都有这个问题:

点击第一响应者 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 类别。有关详细信息,请参阅已接受的答案。


【问题讨论】:

  • 可以肯定您配置错误。您需要提供一些关于如何配置内容的线索,尤其是与文本选择相关的内容。也许检查this answer 以获取线索。
  • @Hot Licks 感谢您的评论。明天将举一个发生这种情况的例子。
  • 你能分享部分代码和/或情节提要发生的地方吗?还是一些演示项目?

标签: ios objective-c uitextfield uikit uitextview


【解决方案1】:

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

在创建此故障时,我假设类别方法仅适用于 UIView 子类,#import 此类别。

Apple Documentation中描述的情况并非如此:

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

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

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

只不过是一种痛苦的学习/接受方式,在类别中覆盖方法绝不是一个好主意 - 除非你想造成像这样的奇怪崩溃 ;-)。

很抱歉占用了您的时间,但感谢您提出一些代码示例,这些示例迫使我认真地重现问题 - 这导致我导致崩溃...

【讨论】:

    猜你喜欢
    • 2014-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多