以编程方式调用 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】:

您需要设置图像属性而不是UIButtonbackgroundImage 属性。 使用defaultImage 属性和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

以编程方式修改 UIToolBar 项

UIButton click(IBAction)没有以编程方式触发

如何以编程方式禁用/启用UIBarButtonItem

以编程方式回调按钮时发送到实例的无法识别的选择器