将UILabel连接到IBOutlet会导致崩溃。

7

我有一个从xib文件中加载并推送到导航控制器栈的UIViewController。

在视图控制器的头文件中,我有以下代码:

IBOutlet UILabel *myTitle;

我在代码中还没有对“myTitle”进行任何操作,我只是在设置连接。
当我编译并运行应用程序时,如果xib文件中没有定义标签(因此,没有任何IBOutlet附加到它),它可以正常工作。视图控制器可以很好地动画显示,展示我在Interface Builder中构建的视图。
如果我在Interface Builder中向xib添加一个标签,但不将其连接到IBOutlet,并重新编译,则仍然可以正常工作,并显示我为其输入的默认文本。
但是,如果我将IBOutlet myTitle连接到Interface Builder中的标签,重新编译并运行应用程序,在尝试将视图控制器推入导航控制器的堆栈时,就会崩溃。
*** -[UILabel copyWithZone:]: unrecognized selector sent to instance 0x4558e20

如果我再次断开插座,它会恢复工作,并显示与之前相同的静态标签。似乎在显示视图时有一些奇怪的事情发生,因为当我将视图推入导航堆栈时发生崩溃。
我是否不应该向UILabel添加IBOutlet或其他问题?还是其他问题正在发生?有什么建议可以寻找麻烦的地方?
4个回答

9

是的,这可能是由于参数名称错误引起的,例如尝试这样做:

IBOutlet UILabel title;

如果出现以下异常,那么就会调用它:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[UILabel copyWithZone:]: unrecognized selector sent to instance 0x143f520'

5
当我试图将一个IBOutlet命名为"title"时,遇到了问题。但当我将其更名为"theTitle"时,一切都好了。显然在此处必须小心变量名称以避免冲突。 - Ben Clayton
2
确实,“title”是保留的,而且没有很好的错误标记来让您知道您已经踩到了UIView内部定义。今晚我被这个问题困扰了一段时间。 - radven
拜托,我也是,卡在那里好久了,谢谢! - Adam Waite

6

你为IBOutlet创建了访问器吗?

@property (assign) IBOutlet UILabel *myTitle;

然后,在你的 .m 文件中

@synthesize myTitle

我有一个相同的问题,并且我已经创建了一个访问器。如果我设置断点,它会在我甚至到达第一行代码之前就崩溃了。在我的情况下,问题出现在第一个(也是唯一的)视图控制器中。 - Andiih

5

我也遇到了同样的问题。原来 *title 是保留字段,但 Xcode 并没有告诉你这一点。一旦将其重命名为其他名称,问题就解决了。


1
在我的情况下,我在UIToolBar中有一个UILabel。对我有用的解决方法是删除toolBar并添加一个带有新UILabel的新工具栏。这是一个IB的错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接