【问题标题】:UIButton setImage not workingUIButton setImage 不起作用
【发布时间】:2012-01-27 00:46:04
【问题描述】:

我正在为这件事失去理智。我将 UIButton 连接为插座。我想改变它的形象。在 viewDidLoad 函数中,我尝试像这样设置图像:

[button1 setImage:[UIImage imageNamed:@"house.png"] forState:UIControlStateNormal];

什么都没有发生。但是,如果我使用 ImagePicker,它会以某种方式工作。在 ImagePickers 函数“didFinishPickingImage”中,我重复与上面完全相同的命令来设置图像,它可以正常工作,图像正常显示。

我一直在想,也许按钮的图像本身没有刷新,但尝试调用 [button1 setNeedsDisplay] 或 [button1.imageView setNeedsDisplay] 甚至 [button1.imageView.image setNeedsDisplay] 什么都没做。

有人对此有任何想法吗?我现在已经浪费了两个小时,我真的很沮丧,因为我确信原因一定是愚蠢到令人难以置信。

【问题讨论】:

  • 请注意:我相信您在问题中引用的方法是deprecated since iOS 3.0
  • 拆分UIImage调用和NSLog它,确保它不是nil?如果是,它会静默失败。
  • 嗯,尝试将相同的代码放在 viewWillAppear 中。听起来无论出于何种原因,运行代码时“button1”仍然为零。您可以检查一下 - 在调用此行时设置断点,Button1 的值是多少?
  • 我不知道弃用,感谢您提供的信息。
  • 我刚刚发现如果一个 UILabel 对象直接包含一个 UIButton 会导致同样的问题,将 UIButton 移动到 UIView 解决了它。祝你好运!

标签: iphone objective-c uibutton


【解决方案1】:

请检查您的按钮类型。

如果您的按钮类型是“系统”,则应将其更改为“自定义”

【讨论】:

  • 我使用的是 UIButton 的子类版本,这是我唯一错过的东西,它浪费了我太多时间。
  • 我如何知道我的按钮类型是否为系统?如何将其更改为自定义?
  • @JackRobson [UIButton buttonWithType:UIButtonTypeCustom]
【解决方案2】:

这里有两件事要做:

#1,将代码更改为:

[button1 setImage:[UIImage imageNamed:@"house.png"] forState:UIControlStateNormal];

和#2

确保你的 UIImage 返回一个有效的图像。

换句话说,

UIImage * imageToSet = [UIImage imageNamed: @"house.png"];
if(imageToSet)
{
    [button1 setImage:[UIImage imageNamed:@"house.png"] forState:UIControlStateNormal];
} else {
    // if you see this line in your console, then you know where to look for a problem
    NSLog( @"why is my image object nil?");
}

【讨论】:

  • 对于#1,我看不出您的代码与原始代码有何不同?
  • 好的,想通了,很抱歉惊恐发作。按钮位于表格单元格内,并且在 viewWillAppear 状态下尚未加载/创建单元格,因此该按钮在那个阶段仍然为零。我已经在“cellForRowAtIndexPath”函数中移动了加载图像的代码
  • 嗨@Jordan;在 o.p. 之前编辑了他的问题,他使用了一种稍微不同的方式来调用setImage 方法的forState 参数。单击问题下的“已编辑”链接将显示原件的外观。我很高兴一切顺利。
  • @MichaelDautermann 啊有道理:) detra83 - 很高兴你解决了这个问题!但不确定这个答案是否应该是公认的解决方案,因为不是这个答案解决了你的问题。由于它可能会误导有相同问题并查看此答案的其他人(因为它是“已接受”的答案),因此最好用您的解决方案编写您自己的答案并接受它:)
  • 是的,第一个版本有错字。我实际上是在使用它,就像我编辑了我的帖子一样,但我没有立即发现错字。 @Jordan:我会更正它,但由于我的名声,直到 7 个小时左右我才能接受自己的答案,所以我明天必须这样做。感谢您的提醒。
【解决方案3】:

对于任何会发现自己处于类似情况的人;我在表格视图的自定义单元格中使用提到的按钮。但是,单元格不会立即加载(即在 viewDidLoad/viewWillAppear 等内部),而是在 tableView:cellForRowAtIndexPath 函数内部。那时我所有的按钮变量都为零。我的解决方案是在创建单元格后加载图像,然后立即工作。

【讨论】:

    【解决方案4】:

    这里有几个附加说明。 UIButton setImage: forState: 是正确的方法:

    [button1 setImage:[UIImage imageNamed:@"house.png"] forState:UIControlStateNormal];
    

    imageNamed 是获取图像的一种非常方便的方法,但请确保它返回一个对象。忘记在当前目标中包含图像文件总是让我感到厌烦。

    [UIImage imageNamed:@"house.png"] 
    

    您也不需要扩展程序。 SDK 解决了这个问题。

    [UIImage imageNamed:@"house"] 
    

    即使 UIControlState 是一个位掩码,您也不能将这些值组合在一起。这不是行不通的,我必须记住这一点,因为每次我使用呼叫时都会得到它。

    // NO NO NO
    [button1 setImage:[UIImage imageNamed:@"house"] forState:UIControlStateNormal|UIControlStateSelected]; 
    
    // YES
    [button1 setImage:[UIImage imageNamed:@"house"] forState:UIControlStateNormal];
    [button1 setImage:[UIImage imageNamed:@"house"] forState:UIControlStateSelected]; 
    

    【讨论】:

    • 屏蔽在 Swift 1.2 + Xcode 6.4 中对我有用,如下所示:button.setImage(filledStarImage, forState: UIControlState.Highlighted|UIControlState.Selected)
    【解决方案5】:

    UIbuttonUITableViewCell 中时遇到了同样的问题。

    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    [button setImage:[UIImage imageNamed:@"detail.png"] forState:UIControlStateNormal];
    

    应该在UITableViewCell工作

    【讨论】:

      【解决方案6】:

      很高兴知道问题已解决,但没有一个答案真正解决了问题。

      通常,如果代码正确,则错误会从“语法错误”转移到“逻辑错误”类别。没有明确的指南来处理它,但这里有一个小清单,可以帮助任何人解决他们的代码问题。

      1) IBOutlet 未连接或重命名。

      2) 确保 UIButton 类型为custom

      3) 图像被设置(不止一次),在代码的其他地方。

      4) 您正在尝试通过任何不使用主线程的sync method 设置图像。 (仅此一项就有好几个线程)。

      5) 如果您将图像嵌套为子视图,请确保问题不在于其父视图。

      6) 如果它出现在模拟器中而不出现在设备中,它是一个字母(大写,小写的代码和文件名的区别。

      7) 现代模拟器在旧机器上使用非常低 GPU 内存。您可以调整模拟器选项以使其显示。例如(Command + Right Arrow)两次更改模拟器方向,您的更改将出现。

      开发人员通常会忽略其他一些常见的陷阱

      1) 图片不存在或拼写错误。

      2) 文件类型与提到的不同。 (JPG、PNG)。

      【讨论】:

      • 在我得到您的答案之前已解决,但我感谢您进行彻底的故障排除。
      【解决方案7】:

      最后一件事是您要检查 - 确保您在主线程上设置图像!刚刚遇到一个问题,我在 ALAssetLibrary 的回调中设置按钮图像(从照片库中获取图像)。在我点击按钮之前,图像不会更新。原来回调发生在主...

      【讨论】:

        【解决方案8】:

        对我来说就是移动这条线:

        [button1 setImage:[UIImage imageNamed:@"house.png"] forState:UIControlStateNormal];
        

        来自awakeFromNib方法

        viewDidLoad方法

        【讨论】:

          【解决方案9】:

          我猜, 不要这样创作 UIButton *nextButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 通过这种创建方法,UIButton 是使用默认类型创建的,因此您的背景图像不起作用。 试试这个, UIButton *nextButton = [[UIButton alloc] initWithFrame:CGRectMake(9, 154, 300, 48)]; 或其他,除了buttonWithType

          【讨论】:

            【解决方案10】:

            发生这种情况是因为按钮的状态在默认情况下单击后不会保持选中状态。 我通过在该按钮单击并切换选定状态时进行 IBaction 来解决它。 -(IBAction) checkButtonClicked:(id)sender{ checkButton.selected = !checkButton.selected; }

            【讨论】:

              【解决方案11】:

              在我的情况下,它是由自定义动画代码绘制的,而不是由图像设置的,所以设置任何图像都不起作用,它必须更改动画代码。

              【讨论】:

                【解决方案12】:

                对于图像,您必须将它们导入到项目中,而不是作为参考,而是作为副本。因此,当您将文件添加到项目时,请选择“创建组”而不是“创建文件夹引用”。还要确保选中“如果需要,复制项目”。

                这很令人困惑,因为当您将图像用作纹理时(例如,对于 Sprites),导入作为参考有效。但是,当您想将图像用作按钮时(例如,在 [UIImage imageNamed:@"house.png"] 中使用图像名称时,它就不起作用了

                【讨论】:

                  【解决方案13】:

                  对于那些无法显示系统图像的问题,只需使用systemName: 而不是named

                  if let starImg = UIImage(systemName: "star.fill") {
                      button.setImage(starImg, for: .normal)
                  }
                  

                  适用于 ios13 及更高版本...

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2015-08-31
                    • 2018-01-13
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多