【问题标题】:Setting button image method设置按钮图像方法
【发布时间】:2013-09-27 08:31:59
【问题描述】:

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

-(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

【问题讨论】:

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


    【解决方案1】:

    您正在呼叫[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];
        } }
    

    【讨论】:

    • 我认为@bneely 的意思是[button setImage:nil forState:UIControlStateHighlighted];
    【解决方案2】:

    在使用 Xcode 5 中的新资产目录后,我开始遇到相同的错误“CUICatalog: Invalid asset name provided: , or invalid scale factor: 2.000000”。

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

    所以我同意 bneely(因此得到了我的赞成票)的修复。现在,如果您按照 bneely 的建议进行操作,但仍然出现错误,请确保您检查了您的代码,并可能在您调用 [UIImage imageNamed:] 的任何位置放置一个断点,并查看您传递的是 nil 还是空字符串论据。

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

    (!imageFileName || [imageFileName isEqualToString:@""])

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

    【讨论】:

    • 如果有人想出一种方法来同时编辑多个断点的条件,请告诉我...如果您有一个大型项目,这是一个很难找到来源的错误。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      仅当您使用 IB 或 Storyboards 时才阅读此内容!

      我在情节提要中为 UIImageView 设置图像然后在资产目录中更改该图像名称后遇到了这个问题。故事板中的 ImageView 仍然带有该图像,但在图像视图的属性检查器中,图像字段显示“未知图像”。一切正常,因为后来我通过代码设置图像,除了烦人的日志。

      呃,“形象”这个词好像用多了,希望对大家有所帮助。

      【讨论】:

        【解决方案5】:

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

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

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

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

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

        您只需要这个断点来检查整个代码库的调用源。

        【讨论】:

          【解决方案6】:

          1) 按加号按钮后添加符号断点。 2)添加此布尔行以检查空字符串 3)这是自动添加的(在构建后不确定)所以我编辑添加条件

          希望这可以提供一些额外的帮助,包括我在内。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-09-03
            • 2020-03-19
            • 1970-01-01
            • 1970-01-01
            • 2011-02-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多