无法子类化 UILabel:无法识别的选择器发送到 UILabel

Posted

技术标签:

【中文标题】无法子类化 UILabel:无法识别的选择器发送到 UILabel【英文标题】:Unable to subclass UILabel: Unrecognized selector sent to UILabel 【发布时间】:2017-03-28 21:06:31 【问题描述】:

我正在使用 CocoaPods 导入一些东西。现在我正在尝试使用TTTAttributedLabel,它是UILabel 的丰富子类,允许点击URL 等。

现在,我无法让我的应用识别出我的标签实际上是 TTTAttributedLabel 的实例,而不是常规的 UILabel 的实例。

在我的 .xib 中,我将一个普通的 UILabel 拖到我的视图中,然后像这样编辑标签的类:

它确实为我自动完成了名字,所以我知道它知道这个类。然后,我将连接从 xib 拖到视图的类,如下所示:

它自动将自己指定为TTTAttributedLabel,因为它识别出它就是这样,否则它会说UILabel

由于我在podfile 中指定了use_frameworks!,我必须导入该类,所以在我的视图类的顶部,我有import TTTAttributedLabel

现在,当我尝试使用标签时,它会自动完成如下所示: 使用正确的课程TTTAttributedLabel。 但是当我这样做时:

print("labBody: ", labBody)

它打印出这个:

labBody:  <UILabel: 0x7fa754c86710; frame = (16 459; 42 21); text = 'Label'; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x60000029cf20>>

认为这是一个 UILabel。如果我尝试访问任何 TTTAttributedLabel 特定的变量或函数,它仍会为我自动完成它们:

labBody.enabledTextCheckingTypes = NSTextCheckingResult.CheckingType.link.rawValue

但是当在运行时使用这些时,整个应用程序崩溃了,这样说:

 -[UILabel setEnabledTextCheckingTypes:]: unrecognized selector sent to instance 0x7fdfc7c59300

我是瞎了吗?为什么这不起作用?这是我一直在做的事情。我周二可能会过得很艰难。。 我已经尝试了所有常规的东西,清理,删除派生数据,重新启动 Xcode,在再次运行之前从设备中删除应用程序..

我以前什至用过TTTAttributedLabel,我知道它有效。唯一新的是这是我第一次使用use_frameworks!.. 这会影响.xib 吗?让它无法知道子类,还是什么..?

【问题讨论】:

看看你的控制台;您是否收到警告“无法识别的类 TTTAttributedLabel 在。在文件中”或类似的东西? nib 文件中的自定义类下方显示的是什么模块? @Paulw11 哦,该死的,你是对的!我什至没有注意到。它说Unknown class _TtC16MyApp18TTTAttributedLabel in Interface Builder file.。这是什么意思? 您可以轻松看到 TTTAttributeLabel 方法的自动完成的原因是:您已将其声明为 TTTAttributedLabel。即使该变量的实现是 UILabel,编译器仍会将其视为 TTTAttributedLabel,因此您不会收到编译器的警告。当然,您可以将 UILabel 分配给 TTTAttributedLabel,因为这是超类。 您是否尝试过清理整个项目。退出 xCode 并再次执行 pod install 和 pod update?确保 pod 包含在您的构建目标中。现在重新打开项目并首先构建它(不需要构建和运行)。现在前往您的 xib 文件。选择 UILabel 的类,然后按 Enter!现在单击界面构建器中的其他位置以确保使用了类更改。保存 xib 并再试一次。 @Lepidopteron 仍然无法正常工作,可悲的是.. 当我用谷歌搜索Unknown class .. in Interface Builder file. 时,我收到了很多修复 IB 中的Module 的建议,但模块是正确的。它说“当前 - 我的应用程序”。在下拉列表中,我可以选择“MyApp”,没有区别。我尝试在两个字段中都按回车键,我已经从我的 podfile 中删除了 TTTAttributedLabel 并现在来回重新安装了 pod。我已删除标签并重新添加它们。我已经清理了派生数据,重新启动了 xcode 并重新启动了我的计算机。现在是时候让我重新振作起来了,所以我明天再试一次。 【参考方案1】:

我完全不知道为什么这行得通,但我认为这与这个 pod 在 Objective-C 中以及与绑定和加载 Obj-C 内容有关..

无论如何,我所要做的就是将对象包装在一个新的本地类中。 然后将 .xib 文件中我的标签类更改为此类,而不是 TTTAttributedLabel(显然还有我视图类中的插座)。

除了创建这个类之外不需要做任何事情,它不需要包含任何东西。

我确实读过一些关于设置标志的内容,比如load ObjC-flag,但我没有尝试过。我认为该解决方案还可能会加载许多我不需要/不想加载的其他 Object-C 内容..

【讨论】:

这拯救了我的一天。我在这个问题背后花了大约 2-3 个小时。创建一个空类为我完成了这项工作。

以上是关于无法子类化 UILabel:无法识别的选择器发送到 UILabel的主要内容,如果未能解决你的问题,请参考以下文章

NSManagedObject 子类 - 发送到实例的无法识别的选择器

UITableViewCell 子类抛出一个无法识别的选择器发送到实例

Swift 错误 - “发送到实例的无法识别的选择器”

__NSCFString setHidden:无法识别的选择器发送到实例

以编程方式调用 segue 导致 NSInvalidArgumentException,原因:'UILabel 长度'无法识别的选择器

无法识别的选择器发送到实例...使用 segues 将字符串传递给另一个视图控制器