UIButton背景图片未改变

4

我希望根据Web服务响应更改按钮背景图像。如果响应中获取到未读消息为true,则图像将不同,如果没有未读消息,则图像将不同。我已经成功获取了响应,但无法更改按钮的背景图像。

这是我正在使用的代码片段:

if(unread>0){
    [badgeTitle setBackgroundImage:[UIImage imageNamed:@"unread.png"] forState:UIControlStateNormal];
}
else{
    [badgeTitle setBackgroundImage:[UIImage imageNamed:@"read.png"] forState:UIControlStateNormal];
}

4
您的按钮应该是“自定义按钮”。 - Bhavin
2
你尝试过调试来查看unread变量的值吗?也许问题在于它没有你期望的值。提供更多上下文,展示更多源代码会有所帮助。 - Ramy Al Zuhouri
1
你在xib中设置了图片吗?如果是,请将其删除或仅在xib中设置背景图像,然后再尝试一下。 - Yucel Bayram
但是 @yucelbayram,这没有意义,因为如果我从 xib 中删除背景,那么在此之后它会给我正确的图像,但当我再次点击时,我仍然想要更改,但它并没有改变。 - KDeogharkar
1
@iphonemaclover 是的,它只会加载一次,我只是想检查一下代码是否正常工作,因为如果图像仅更改一次,那么您可以在按钮操作或其他任何地方再次使用if和else语句轻松更改它,您知道的。 - Yucel Bayram
显示剩余12条评论
8个回答

7
如果你眼光放远一些,这个问题的解决方法其实很简单。 使用全局的UIButton而不是局部的会有所帮助。当网页请求返回响应时,该按钮需要在作用域内存在,否则可能会被从内存中移除。
因此,请使用:
self.myButton = [UIButton buttonWithType:UIButtonTypeCustom];

[self.myButton setBackgroundImage:[UIImage imageNamed:@"unread.png"] forState:UIControlStateNormal];

或者

[self.myButton setImage:[UIImage imageNamed:@"unread.png"] forState:UIControlStateNormal];

如果你想在点击按钮时进行检查,请按以下步骤操作

-(IBAction)checkForMsgCount: (id)sender
{
  UIButton *buttonObj = (UIButton*)sender;

[buttonObj setBackgroundImage:[UIImage imageNamed:@"unread.png"] forState:UIControlStateNormal];
}

这将更改响应该函数的按钮的背景图片。


这根本没有任何意义,我已经调试了很多次,无论按钮是否被移除,它始终存在。 - KDeogharkar
解决方案明确指出,您需要清楚地知道哪个按钮正在响应该方法。这可以通过将发送者对象强制转换为UIButton,然后更改其图像来实现。尝试一下,如果不起作用,请告诉我。 - Hitesh
我自己用过这个。告诉你,它会起作用的。试试吧! - Hitesh

1
[YourBtn setImage:[UIImage imageNamed:@"your.png"] forState:UIControlStateNormal];

请试一下。
您也可以尝试这个,以检查您的捆绑包中是否真的有这些图片。
        NSString *bundlePath = [[NSBundle mainBundle] bundlePath];
        NSString *imagePath = [[NSString alloc] initWithFormat:@"%s/yourButton.png", [bundlePath  UTF8String]];


if ([[NSFileManager defaultManager] fileExistsAtPath:imagePath]) {
    NSLog(@"image exists");
}
else{
    NSlog(@"image Does Not Exist");
      }

1
请尝试下面的代码。
if(unread>0){
    [badgeTitle setBackgroundImage:[UIImage imageNamed:@"unread.png"] forState:UIControlStateNormal];
    [badgeTitle setBackgroundImage:[UIImage imageNamed:@"unread.png"] forState :UIControlStateSelected];
}
else{
    [badgeTitle setBackgroundImage:[UIImage imageNamed:@"read.png"] forState:UIControlStateNormal];
    [badgeTitle setBackgroundImage:[UIImage imageNamed:@"read.png"] forState :UIControlStateSelected];
}

他想同时更改UIControlState选中和正常状态下的图像。您应该调用该方法两次,以为这两个控件状态添加图像。此外,您还应该对此代码进行一些解释,并说明用户做错了什么。 - Ramy Al Zuhouri
是的,它会起作用,请检查一下,如果您只想更改UIControlStateNormal,它将起作用。 - user1288192
为什么你不把for循环放在第二行? - KDeogharkar
哦,这只是语法错误,请在应用此代码时添加这个。 - user1288192

0

首先检查您的按钮的IBOutlet连接:)

在从Web服务获取数据后设置您的代码,即在获取未读值后。

if(unread>0){
    [badgeTitle setBackgroundImage:[UIImage imageNamed:@"unread.png"] forState:UIControlStateNormal];
}
else{
    [badgeTitle setBackgroundImage:[UIImage imageNamed:@"read.png"] forState:UIControlStateNormal];
}

并且它与UIControlStateNormal处于“或”状态。顺便说一下,仅使用UIControlStateNormal是不起作用的。 - KDeogharkar
请检查您的按钮的 IBOutlet 连接 :) - Rajneesh071
然后从头开始制作一个新按钮 :) - Rajneesh071
老兄,很多时候这个方法可以用来移除之前的对象并创建新的。 - Rajneesh071

0
[badgeTitle setBackgroundImage:[UIImage imageNamed:@"unread.png"] forState:UIControlStateNormal|UIControlStateSelected];

你是要为UIControlStateNormal还是UIControlStateSelected添加按钮图像?
试试看。
[badgeTitle setBackgroundImage:[UIImage imageNamed:@"unread.png"] forState:UIControlStateNormal];

查找图像是否存在并已正确添加到捆绑包中,且名称正确


图片存在 @Lithu - KDeogharkar
@BaZinga 尝试为控件状态正常和选定设置图像的两行。 - Lithu T.V
@BaZinga,既然你正在设置foe selected,请尝试为unselected状态设置图像。 - Lithu T.V

0

为UIControlStateNormal和UIControlStateSelected设置背景图片,作为单独的行

if(unread>0){

   [badgeTitle setBackgroundImage:[UIImage imageNamed:@"unread.png"] UIControlStateNormal];

   [badgeTitle setBackgroundImage:[UIImage imageNamed:@"unread.png"] UIControlStateSelected];
} else {

   [badgeTitle setBackgroundImage:[UIImage imageNamed:@"read.png"] UIControlStateNormal];

   [badgeTitle setBackgroundImage:[UIImage imageNamed:@"read.png"] UIControlStateSelected];
}

正确,但请至少添加一些解释。 - Ramy Al Zuhouri
同上回答! - 9to5ios

0
UIButton *btn = [[UIButton alloc]init];
    btn.frame = CGRectMake(50, 50, 100, 50);
    [btn setTitle:@"ok" forState:UIControlStateNormal];
    [btn setBackgroundImage:[UIImage imageNamed:@"icon.png"] forState:UIControlStateNormal];
    btn.backgroundColor=[UIColor blueColor];

希望这对你有用...


尝试这个: 如果(unread.text.length>0){ [badgeTitle setBackgroundImage:[UIImage imageNamed:@"unread.png"] forState:UIControlStateNormal]; } 否则{ [badgeTitle setBackgroundImage:[UIImage imageNamed:@"read.png"] forState:UIControlStateNormal]; }如果unread是字符串,那么这段代码可以正常工作... - Maulik Kundaliya

0

设置背景图片之后

[badgeTitle setNeedsLayout];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接