【问题标题】:UIButton setImage not working?UIButton setImage 不工作?
【发布时间】:2011-08-16 12:30:21
【问题描述】:

我有以下代码,当我调用此方法时,尽管资源中有图像,但它不会更改按钮的图像。

-(void)changeButton:(NSString*)button withURL:(NSString*)url {
    timetableURL = url;

    UIImage *btnImage;

    if ([button isEqual:@"Browser"]) {
        btnImage = [UIImage imageNamed:@"browser-button.png"];
        [safariBtn addTarget:self action:@selector(onSafariButtonPress:) forControlEvents:UIControlEventTouchUpInside];
    }
    else if ([button isEqual:@"Timetable"]) {
        btnImage = [UIImage imageNamed:@"browser-timetable.png"];  
        [safariBtn addTarget:self action:@selector(onTimetableButtonPress:) forControlEvents:UIControlEventTouchUpInside];
    }

    [safariBtn setImage:btnImage forState:UIControlStateNormal];
    [btnImage release];
}

更新

仅供参考:这是 UIToolbar 上方的按钮。

【问题讨论】:

    标签: iphone objective-c uibutton uiimage


    【解决方案1】:

    您的代码似乎有问题:

    [btnImage 发布] 您使用自动发布创建了该图像,您不对它的发布负责。这很可能会导致奇怪的事情发生,即你遇到的事情。

    你确定 btnImage 在 if 语句之后有内容吗?按钮是否有可能不等于@"Browser" 或@"Timetable"?

    另外,请确保按钮处于正常状态。

    干杯

    【讨论】:

    • 我删除了发布并仔细检查了按钮是否等于时间表。
    • 还有问题吗?如果是这样,请尝试在将图像设置为按钮的行中放置一个断点,确保两者都是有效对象。并记得检查按钮状态,例如,如果它被禁用,您将不会看到任何变化
    • 你检查过按钮处于正常状态吗?
    • 如何在 XCode 中检查这个?我还用更多信息更新了我的问题。
    • 在调试器中设置断点并检查其状态,你可以在命令行中使用类似这样的东西:p [btn state]
    【解决方案2】:

    试试这个,

    [safariBtn setBackgroundImage:btnImage forState:UIControlStateNormal];

    无需释放 btnImage ...

    【讨论】:

    • 谢谢,这对我帮助很大。我在界面构建器上设置背景图像,因此使用“setImage:forState:”导致同时拥有 2 个图像,最初没有任何可见,但是当 2 个图像进入 alpha 0.5 时禁用按钮时,你可以看到他们俩:P
    【解决方案3】:

    我认为这应该对你有所帮助...

        [safariBtn setImage:[UIImage imageNamed:@"browser-button.png"] forState:UIControlStateNormal];
    

    【讨论】:

      【解决方案4】:

      这可能会对您有所帮助:在您创建按钮的位置设置按钮的标题,然后控制它是否等于标题。

      [safariBtn setTitle:@"Safari" forState:UIControlStateNormal];
      

      然后控制

      -(void)changeButton:(NSString*)button withURL:(NSString*)url {
      timetableURL = url;
      
      UIImage *btnImage;
      
      if ([button titleForState:UIControlStateNormal] isEqualToString:@"Safari"]) {
          btnImage = [UIImage imageNamed:@"browser-button.png"];
          [safariBtn addTarget:self action:@selector(onSafariButtonPress:) forControlEvents:UIControlEventTouchUpInside];
      }
      else if ([button titleForState:UIControlStateNormal] isEqualToString:@"Timetable"]) {
          btnImage = [UIImage imageNamed:@"browser-timetable.png"];  
          [safariBtn addTarget:self action:@selector(onTimetableButtonPress:) forControlEvents:UIControlEventTouchUpInside];
      }
      
      [safariBtn setImage:btnImage forState:UIControlStateNormal];
      [btnImage release];
      

      }

      【讨论】:

      • button 是作为 NSString 传入的,而不是 UIButton,因此不会有 titleForState 方法 - 你的意思是 [safariBtn titleForState:UIControlStateNormal] isEqualToString:
      【解决方案5】:

      改变

      [button isEqual:@"Browser"]
      

      [button isEqualToString:@"Browser"]
      

      isEqual 正在测试对象相等性,而不是字符串相等性。

      编辑:好的,您说您的按钮位于工具栏内。在这种情况下,我假设您已将其作为自定义视图添加到 UIBarbuttonItem?您需要通过栏按钮项目并在栏按钮项目的自定义视图上设置图像属性,我认为(虽然我不确定)一旦您将按钮添加为自定义视图,栏按钮项目制作它自己的副本,因此您不再通过 safariBtn 与它交谈。

      您可以通过

      访问工具栏项
      for (UIBarButtonItem *barItem in self.toolbar.items)
      

      假设这段代码在你的 viewController 中。然后您的 safariBtn 将可以通过 barItem.customView

      访问

      【讨论】:

      • 您是否检查过 safariBtn 和 btnImage 在设置图像时绝对不是nil 的日志记录/断点?我假设 safariBtn 是一个类 ivar?不将按钮作为参数传递,而是传递字符串似乎不寻常。
      • safariBtn 是 UIButton 类型,我可以看到 btnImage 不为空。
      • 实际上它是 UIButton,我已经使用属性设置了图像,但在运行时我想再次更改图像。
      • 那你是如何将它添加到工具栏的呢?你能显示那个代码吗?
      • 好吧,我只需将 UIButton 拖放到 UIToolbar 上,它就会坚持下去。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-31
      • 2018-01-13
      • 2021-02-04
      • 1970-01-01
      • 2012-08-07
      相关资源
      最近更新 更多