无法子类化 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 子类抛出一个无法识别的选择器发送到实例
__NSCFString setHidden:无法识别的选择器发送到实例
以编程方式调用 segue 导致 NSInvalidArgumentException,原因:'UILabel 长度'无法识别的选择器