将 UILabel 连接到 IBOutlet 会导致崩溃

Posted

技术标签:

【中文标题】将 UILabel 连接到 IBOutlet 会导致崩溃【英文标题】:Connecting a UILabel to an IBOutlet causes a crash 【发布时间】:2009-10-29 17:13:12 【问题描述】:

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

在视图控制器的头文件中,我有:

IBOutlet UILabel *myTitle;

我还没有对代码中的“myTitle”做任何事情;我只是在设置连接。

当我编译并运行应用程序时,在 xib 文件中没有定义任何标签(因此,没有任何附加到 IBOutlet),它可以工作。视图控制器的动画效果很好,显示了我在 Interface builder 中构建的视图。

如果我在界面构建器中向 xib 添加标签,但不将其连接到插座,然后重新编译,它仍然可以工作,并显示带有我为其输入的默认文本的标签。

但是,如果我将 IBOutlet myTitle 连接到界面生成器中的标签,重新编译并运行应用程序,它会正常工作,直到我尝试将视图控制器推送到导航控制器的堆栈上,此时我会崩溃:

*** -[UILabel copyWithZone:]: unrecognized selector sent to instance 0x4558e20

如果我再次断开插座,它会恢复工作,并像以前一样显示静态标签。显示视图时似乎发生了一些奇怪的事情,因为当我将视图推送到导航堆栈时发生崩溃。

我不应该将 IBOutlet 添加到 UILabel 或其他东西吗?还是有其他事情发生?有什么建议可以去哪里找麻烦?

【问题讨论】:

【参考方案1】:

是的,这可能是由错误的参数名称引起的,例如试试这个:

IBOutlet UILabel title;

它会像这样调用异常:

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

【讨论】:

我在尝试调用 IBOutlet 'title' 时遇到了这个问题。如果我将其重命名为“theTitle”,那么一切都很好。大概你必须小心你的变量名以避免冲突。 确实 - 'title' 是保留的,并且没有很好的错误标记让您知道您已经踩到了 UIView 中的内部定义。这个让我今晚难倒了一段时间。 大声哭泣,我也是,被困在那个年代了,谢谢!【参考方案2】:

您是否为您的 IBOutlet 创建了访问器?

@property (assign) IBOutlet UILabel *myTitle;

然后,在您的 .m 文件中

@synthesize myTitle

【讨论】:

我有一个相同的问题,我创建了一个访问器。如果我设置断点,它甚至在我到达第一行代码之前就爆炸了。就我而言,问题出在第一个(唯一)视图控制器中。【参考方案3】:

我遇到了同样的问题。原来 *title 是保留的,Xcode 没有告诉你这一点。一旦我将其重命名为其他名称,它就可以工作了。

【讨论】:

【参考方案4】:

在我的情况下,我在 UIToolBar 中有一个 UILabel。为我解决的问题是删除工具栏并添加一个带有新 UILabel 的新工具栏。一个 IB 错误。

【讨论】:

以上是关于将 UILabel 连接到 IBOutlet 会导致崩溃的主要内容,如果未能解决你的问题,请参考以下文章

插座无法连接到重复内容 iOS

Swift ios将多个项目连接到同一个IBOutlet

IBOutlet 用于约束并以编程方式将其连接到 UIButton

将情节提要的 UITableView 连接到 .m UIViewController 作为 IBOutlet

如何将 UITextField 数据复制到 UILabel

ScrollView中的IBOutlet生成为零