TouchUpInside事件后无法将UIButton保持在选定状态

时间:2012-01-11 14:51:47

标签: iphone ios uibutton

我需要一个UIButton来维持一个按下状态。基本上,如果按钮处于正常状态,我想触摸按钮,它突出显示其标准蓝色,然后抬起我的手指后保持蓝色。 我做了以下UIAction并将按钮Touch Up Inside事件连接到它。

-(IBAction) emergencyButtonPress:(id) sender
{
    if(emergencyButton.highlighted)
    {
        emergencyButton.selected = NO;
        emergencyButton.highlighted = NO;
    }
    else
    {
        emergencyButton.selected = YES;
        emergencyButton.highlighted = YES;
    }
}

但是,当我移开手指后,按钮会回到白色背景。对于测试,我添加了一个UISwitch并让它执行相同的代码:

-(IBAction) emergencySwitchClick:(id) sender
{
    if(emergencyButton.highlighted)
    {
        emergencyButton.selected = NO;
        emergencyButton.highlighted = NO;
    }
    else
    {
        emergencyButton.selected = YES;
        emergencyButton.highlighted = YES;
    }
}

在这种情况下,按钮会切换到突出显示的非突出显示状态,如我所料。

在Touch Up Inside事件之后是否会发生另一个事件,即将状态重置为“正常”?如何保持突出显示的状态?

7 个答案:

答案 0 :(得分:6)

触摸/释放按钮时,iOS会应用和删除突出显示的状态。所以不要在你的行动方法中依赖它。

正如其他答案之一所说,将突出显示的图像设置为与所选图像相同,然后修改您的操作方法:

-(IBAction) emergencyButtonPress:(id) sender 
{
    emergencyButton.selected = !emergencyButton.selected;     
} 

答案 1 :(得分:2)

如果你想要一个类似切换按钮的东西,将你的“选中”状态自定义为你的“按下”状态,然后写下这样的东西:

- (IBAction)buttonTapped:(id)sender {
    [(UIButton*)sender setSelected:![sender isSelected]];
}

答案 2 :(得分:1)

如果您希望上述代码有效,您应该为所选状态设置一个图像,并为其状态突出显示一个(甚至相同)。

[emergencyButton setBackgroundImage:buttonHighlightImage forState:UIControlStateHighlighted];
[emergencyButton setBackgroundImage:buttonHighlightImage forState:UIControlStateSelected];
希望它有所帮助。

答案 3 :(得分:1)

我有同样的问题,这对我有用:

-(IBAction)buttonPressed:(id)sender {
if (isSelected) {
    [_button setSelected:NO];
    [_button setImage:[UIImage imageNamed:@"not_selected.png"] forState:UIControlStateSelected]; 
    isSelected=NO;

}
else {
    [_button setSelected:YES];
    [_button setImage:[UIImage imageNamed:@"selected.png"] forState:UIControlStateSelected];
    isSelected=YES;
}
}

答案 4 :(得分:0)

不幸的是,这是不可能的,只要你放手,Apple就会再次改变状态。 我之前使用的一个选项(但不是很漂亮)是在按下按钮后再使用延迟为0.1的performSelector将其再次置于选定状态。这确实适用于我的情况。

编辑:如果您不想看到闪烁效果,只需将延迟设置为0.0

答案 5 :(得分:0)

这对我有用:

- (void)tapButton:(id)sender{
    UIButton *button = sender;
    if (!button.selected){
        [self performSelector:@selector(highlight:) withObject:button afterDelay:0.0];
    }else{
        [self performSelector:@selector(removeHighlight:) withObject:button afterDelay:0.0];
    }
}

- (void)highlight:(UIButton *)button{
    button.selected = !button.selected;
    button.highlighted = YES;
}

- (void)removeHighlight:(UIButton *)button{
    button.selected = !button.selected;
    button.highlighted = NO;
}

答案 6 :(得分:0)

试试这个简单的答案......

- (void)mybutton:(id)sender
{
    UIButton *button = (UIButton *)sender;
    button.selected = ![button isSelected]; // Important line
    if (button.selected)
    {
        NSLog(@"Selected");
        NSLog(@"%i",button.tag);
    }
    else
    {
        NSLog(@"Un Selected");
        NSLog(@"%i",button.tag);

    }
 }