60

我觉得我在这里用头撞墙(坦率地说,我已经准备好这样做了)。

我正在尝试为视图设置背景。我需要设置的背景是一个图像,我正在使用这个代码(它在其他两个 UIViewController 子类中工作得很好——这是一个复制/粘贴到新文件中):

UIImage *img = [gameNode imageFromKey:@"background"];
UIColor *bg = [[UIColor alloc] initWithPatternImage:img];
self.view.backgroundColor = bg;
[bg release];

正如我所说,这在另外两个地方工作得很好,但是在这里,线self.view.backgroundColor = bg抛出

'NSInvalidArgumentException', reason: '-[UILabel copyWithZone:]: unrecognized selector sent to instance 0x9259840'

没有更多的事情要做。我在 IB 中验证了顶级视图的引用出口设置为文件的所有者。我清理了项目并重新启动。我什至关闭了 Xcode 并重新启动它 - 不走运。我还缺少什么?

编辑: 正如我所提到的,没有太多的回溯堆栈跟踪,只是这个:

2012-05-28 13:13:56.997 OOKL[36012:17303] -[UILabel copyWithZone:]: unrecognized selector sent to instance 0x92b79a0
2012-05-28 13:13:56.997 OOKL[36012:17303] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UILabel copyWithZone:]: unrecognized selector sent to instance 0x92b79a0'
*** First throw call stack:
(0x2933052 0x44c7d0a 0x2934ced 0x2899f00 0x2899ce2 0x2935bd9 0xaa92dd 0x6a4f40 0x6a4eeb 0x6bfd60 0xc0191a 0x2934e1a 0x289e821 0xc0046e 0xaa7e2c 0xaa83a9 0xaa85cb 0xb2b59 0xb1969 0x2934ec9 0x9e55c2 0x9e555a 0xa8ab76 0xa8b03f 0xa8a2fe 0xa0aa30 0xa0ac56 0x9f1384 0x9e4aa9 0x2ac6fa9 0x29071c5 0x286c022 0x286a90a 0x2869db4 0x2869ccb 0x2ac5879 0x2ac593e 0x9e2a9b 0x214d 0x20c5)

没有别的——之前或之后。

4

7 回答 7

197

我想这是 Xcode 的那些奇怪的错误之一,你无法每次都跟踪或重现。我将问题缩小到 IB 中的一个特定 UILabel。一旦我将它连接到IBOutlet UILabel *,我就会收到此错误。

经过进一步调查,事实证明是这个名字title导致了这个问题。我将标签声明为

IBOutlet UILabel *title;

一旦我将名称更改为gtitle,一切都按预期工作。谁知道?..

于 2012-05-28T12:42:19.963 回答
0

试试这个 :

self.view.backgroundColor = [UIColor clearColor];
self.view.layer.backgroundColor = [[UIColor alloc] initWithPatternImage:img].CGColor;
于 2012-05-28T11:58:48.203 回答
0

这绝对看起来像一个“过度发布”的问题。

在您的示例中很难说出原因(因为代码看起来非常好),但是您在 ( 而不是)copyWithZone的实例上发送选择器这一事实肯定会告诉我已经过度释放并且现在正在引用到一个。UILabelUIColorbgUILabel

稍后在代码中检查您是否再次释放该对象bg

希望这可以帮助

在您第一次发表评论后进行编辑

您收到 a 很奇怪copyWithZone unrecognized selector sent to instance,因为我相信如果您self.view的类型错误(不是 a UIView),那么您将收到 asetBackgroundColor unrecognized selector sent to instance而不是 a copyWithZone

为了更好地分析这个问题,当引发异常时,我会在调试器中写入:

po [self view]
po [[self view] backgroundColor]

看看一切是否顺利进行。

于 2012-05-28T12:00:28.450 回答
0

这个问题昨晚发生在我身上,实际上我确实有一个名为标题的标签。将名称更改为其他名称不起作用时,我扯掉了一点头发。事实证明,我试图将 NIL 值从文本字段发送到 VC 中的标签。我有 4 个 VC,用户在文本字段中的 VC 1 处输入标题,并将其存储到 NSString 类型的对象中。该字符串被放入 VC 4 中的标签中。当用户没有在 VC 1 中输入标题时,这就是 NIL 出现的地方。当用户没有在 VC1 中输入标题时,我通过为字符串对象分配默认值来修复它。希望对某人有所帮助。

于 2012-09-23T20:42:08.480 回答
0

我有一个类似的问题,我设法使用此处提供的答案解决了这个问题。

然而,就我而言,我有一个名为 UIDateLabel 的类(用于以格式化的方式呈现日期等)。编译运行导致上面提到的NSInvalidArgumentException。

我怀疑也许有一个这样的类,但是在 UIDateLabel 上搜索只显示了一些晦涩的点击(我可以看到没有一个与 Apple 相关联)。所以我认为暂时没有命名问题......直到我在这里阅读了答案并尝试了一下。

因此,我将名称替换为 UIDateLabelAbc,一切正常。重命名回 UIDateLabel 不起作用,因为 XCode 告诉我已经有一个具有该名称的类。所以我做了更多的谷歌搜索,发现了一些声称列出 UIKit.framework 继承层次结构的 wiki 页面,在该列表中我发现 UIDateLabel 列出了。但是,这就是我设法找到的关于该类的所有信息,即它存在。目前我还不知道它的作用、目的等。

更新: 在阅读了命名约定之后,我现在意识到在你的类前面加上 UI 并不是一个好的做法(至少可以这么说)。所以,不要在你的类前面加上 UI,这样你就可以避免这个问题,而且可能还有很多其他问题。

于 2013-09-03T11:48:42.137 回答
0

当我声明一个 IBOutlet 变量并为其赋予与该视图控制器中的其他名称相同的名称时,我收到此错误。更明智地重命名我的变量和函数因此解决了这个问题

于 2015-03-04T18:17:50.453 回答
0

Swift 5 在我的案例中

YOURBUTTON.addTarget(self, action: #selector(funCross), for: .touchUpInside)

//MARK:- My Function 
@objc func funWithSearch(screen: String)
{

}

if you focus on #selector(funCross) i am calling a function without object

当我使用它时它的工作正常

YOURBUTTON.addTarget(self, action: #selector(funTemp), for: .touchUpInside)

//MARK:- My Function 
@objc func funTemp()
{
    funWithSearch(screen: "etc your desire string")
}

//MARK:- My Function 
@objc func funWithSearch(screen: String)
{

}
于 2019-08-09T06:55:20.537 回答