以编程方式调用 ibaction 方法不会改变按钮的背景?
Posted
技术标签:
【中文标题】以编程方式调用 ibaction 方法不会改变按钮的背景?【英文标题】:calling the ibaction method programmatically is not changing the background of the button? 【发布时间】:2013-06-10 10:47:17 【问题描述】:我有一个应用程序,我在其中向滚动视图添加了一些动态数量的按钮。我为UIButton
设置了普通背景和选定背景。由于某些原因,我需要通过以下方式以编程方式调用UIButton
sender 方法:
[self buttontapped:nil];
这样,但它没有通过使用代码来改变按钮的背景:
button.selected = YES;
我最初设置按钮的背景是这样的:
btn = [UIButton buttonWithType:UIButtonTypeCustom];
int j = i+1;
btn.frame = CGRectMake((j-1)*77, 0, 77, 44);
[btn setBackgroundImage:[UIImage imageNamed:@"bar.png"] forState:UIControlStateNormal];
[btn setBackgroundImage:[UIImage imageNamed:@"bar_hvr.png"] forState:UIControlStateSelected];
btn.selected = NO;
btn.backgroundColor = [UIColor clearColor];
btn.titleLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size:14];
btn.titleLabel.textColor = [UIColor whiteColor];
[btn setTitle:head forState:UIControlStateNormal];
btn.tag = i;
[tabBarS addSubview:btn];
-(void)buttonTapped:(id)sender
if(sender==nil)
btn.tag=0;
for(int i=0;i<[sarray count];i++)
btn.selected=NO;
btn = (UIButton *)sender;
NSLog(@"Tab bar %d is clicked",btn.tag);
[self tabCall:btn.tag];
btn.selected = YES;
但是除了改变背景之外的一切都只能工作。我哪里错了?
【问题讨论】:
我认为发件人价值不正确。 我怀疑 btn 持有其他按钮的实例而不是所需的实例。尝试调试它。 更改 IBAction 而不是 -(void)buttonTapped:(id)sender。 在setSelect if(btn.selected)后检查Button的状态 你在哪里设置背景?btn
是否已创建并连接?
【参考方案1】:
我完成了下面的方法调用你的 UIButton 方法,如:-
btn= [UIButton buttonWithType:UIButtonTypeCustom];
int j=i+1;
btn.frame = CGRectMake((j-1)*77, 0, 77, 44);
[btn setBackgroundImage:[UIImage imageNamed:@"bar.png"] forState:UIControlStateNormal];
[btn setBackgroundImage:[UIImage imageNamed:@"bar_hvr.png"] forState:UIControlStateSelected];
btn.selected=NO;
[btn addTarget:self action:@selector(yourButtonAction:) forControlEvents:UIControlEventTouchUpInside];
btn.backgroundColor = [UIColor clearColor];
btn.titleLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size:14];
btn.titleLabel.textColor = [UIColor whiteColor];
btn.tag = i;
[tabBarS addSubview:btn];
它的 Action Method 应该和 sender 一样
-(IBAction)yourButtonAction:(id)sender
UIButton *btn = (UIButton*)sender;
if (![btn isSelected])
[btn setImage:[UIImage imageNamed:@"selected_fb_btn.png"] forState:UIControlStateNormal];
[btn setSelected:YES];
[self login];
else
[btn setImage:[UIImage imageNamed:@"facebook.png"] forState:UIControlStateNormal];
[btn setSelected:NO];
编辑
您可以使用以下技巧以编程方式调用按钮操作事件:-
[btn sendActionsForControlEvents:UIControlEventTouchUpInside];
【讨论】:
我们可以假设-(IBAction)yourButtonAction:(id)sender
而不是这个-(IBAction)yourButtonAction:(UIButton*)sender
对吗?无需在本地创建一个按钮:)
尝试精细化编程按钮事件 [btn sendActionsForControlEvents:UIControlEventTouchUpInside];【参考方案2】:
先写下下面这行,并将方法类型从void
更改为IBAction
...
btn = (UIButton *)sender;
如下图……
-(IBAction)buttonTapped:(id)sender
btn = (UIButton *)sender;
if(sender==nil)
btn.tag=0;
for(int i=0;i<[sarray count];i++)
[btn setSelected:NO];
NSLog(@"Tab bar %d is clicked",btn.tag);
[self tabCall:btn.tag];
[btn setSelected:YES];
【讨论】:
我需要做第一个按钮的选择过程需要以编程方式完成吗? 是不是因为sender是nil? @hacker 使用自定义按钮代码查看此链接并使用该代码而不是您的代码 parasjoshi3.blogspot.in/2012/12/custom-button.html :)【参考方案3】:您需要设置图像属性而不是UIButton
的backgroundImage
属性。
使用default
Image 属性和selected
属性。
[btn setSelected:TRUE];
【讨论】:
【参考方案4】:您正在打印的日志,是否正确打印了 button.tag?
NSLog(@"标签栏%d被点击",btn.tag);
【讨论】:
【参考方案5】:在您的按钮操作中
btn.selected=YES;
在最后一行使按钮始终处于选中状态
也得到正确的实例为
btn=(UIButton *)sender;
【讨论】:
您只需要强制转换即可避免编译器警告。只要sender
响应selected
方法,这不是问题的原因。以上是关于以编程方式调用 ibaction 方法不会改变按钮的背景?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 4 中以编程方式将 IBAction 添加到按钮?
从 IBAction 以编程方式设置 UISwitch isOn 再次调用 IBAction