设置按钮图像方法

时间:2013-09-22 09:39:55

标签: ios iphone objective-c cocoa-touch uibutton

我希望此方法检查条件是否为真,然后设置特定按钮(按钮)以获取我指定的图像。这是代码。

-(void)canAfford:(float) f: (UIButton*)button {
    if([self playerHas:(f)] == YES) {
        [button setImage:[UIImage imageNamed:nil] forState:UIControlStateNormal];
        [button setImage:[UIImage imageNamed:@"ButtonBGclicked.png"] forState:UIControlStateHighlighted];
    } else {
        [button setImage:[UIImage imageNamed:@"ButtonBG.png"] forState:UIControlStateNormal];
        [button setImage:[UIImage imageNamed:nil] forState:UIControlStateHighlighted];
    }
}

这是我得到的错误。

2013-09-22 10:35:39.985 Tapple[15663:a0b] CUICatalog: Invalid asset name supplied: , or invalid scale factor: 1.000000

6 个答案:

答案 0 :(得分:13)

您正在呼叫[UIImage imageNamed:@""][UIImage imageNamed:nil]。没有图像匹配空字符串。如果您要清除图片,请通过nil而不是调用imageNamed:

试试这个(更新的原始代码,包含@Kyle Fang的评论):

- (void)canAfford:(float) f: (UIButton*)button {
    if([self playerHas:(f)] == YES) {
        [button setImage:nil forState:UIControlStateNormal];
        [button setImage:[UIImage imageNamed:@"ButtonBGclicked.png"] forState:UIControlStateHighlighted];
    } else {
        [button setImage:[UIImage imageNamed:@"ButtonBG.png"] forState:UIControlStateNormal];
        [button setImage:nil forState:UIControlStateHighlighted];
    } }

答案 1 :(得分:5)

使用断点查找导致+ [UIImage imagenamed:]生成错误的特定调用的更好方法是使用符号断点。

打开断点导航器,然后单击左下角的“+”按钮。选择“添加符号断点...”。然后编辑断点以进行这些设置:

符号:+ [UIImage imageNamed:] 条件:$ r2 == nil

条件测试寄存器r2,它指向imageNamed:方法的参数,用于方法的零值参数。您还可以将Condition设置为(BOOL)[(NSString *)$ r2 isEqualToString:@“”],如果您想查看是否将空字符串用作参数。请注意,寄存器r2仅在设备上进行调试时才存在。模拟器将使用不同名称的寄存器,因为它在x86架构上运行。

当满足条件时,调试器将破坏UIKit库的汇编代码,但是您可以在线程的堆栈跟踪中找到调用的原始源。

您只需要使用此单个断点来检查整个代码库中的呼叫源。

答案 2 :(得分:1)

在使用Xcode 5中的新资产目录后,我开始使用相同的错误“CUICatalog:提供的资产名称无效:或无效比例因子:2.000000”。

经过一些调试后,我发现导致该错误的原因是将“nil”或空字符串@“”的参数传递给类方法[UIImage imageNamed:]。即使传递捆绑中不存在的文件名也不会触发该错误。

所以我同意这个修复方法(因此得到了我的投票)。现在,如果你按照惯性建议并仍然得到错误,请确保你完成代码并在你调用的任何地方放置一个断点[UIImage imageNamed:]并查看你是否传递了一个nil或一个空字符串作为参数。

仅供参考,要创建断点,只需单击代码编辑器的左边缘并添加蓝色断点即可。然后右键单击断点并从弹出的菜单中选择“Edit Breakpoint ..”。然后在“条件”框中键入如下内容:

  

(!imageFileName || [imageFileName isEqualToString:@“”])

其中imageFileName是表示您尝试加载的图像文件的字符串。

答案 3 :(得分:1)

我发现这个问题的根源在于我从定义图像中获取数据的数组被标记为weak, nonatomic并从我身下清除。

将数据源数组设置为nonatomic, retain解决了这个难以捉摸的问题。

答案 4 :(得分:1)

1)按加号按钮后添加符号BreakPoint。 plus sign at the bottom 2)添加此布尔线以检查空字符串 boolean line for condition 3)这是自动添加的(生成后不确定)所以我编辑添加条件 check for nil

希望这可以帮助一点额外,包括我。

答案 5 :(得分:0)

只有在使用IB或故事板时才能阅读此内容!

我在故事板中为UIImageView设置了图像,然后在资产目录中更改了该图像名称后出现此问题。故事板中的ImageView仍然使用该图像,但在图像视图的属性检查器中,图像字段显示“未知图像”。一切都运行正常,因为后来我通过代码设置图像,除了恼人的日志。

呃,看起来过度使用“图像”一词,希望它对某人有所帮助。