如何保持一个UIButton被按下的状态(选中或高亮),直到另一个按钮被按下?

6
我在我的视图控制器底部有3个按钮,btn1、btn2和btn3。由于不能完全按照我的要求自定义选项卡栏,因此我使用它们代替选项卡栏。现在的问题是,当按下btn1时,我希望它的图像更改为灰色矩形,而不是正常状态的图像。我在按钮的outlet中设置了两种状态的图像,即btn1Outlet,使用了setimage和uicontrolstate属性。问题是,我无法保持按钮选中状态,直到按下btn2或btn3。只要我离开按钮,btn1就会从选中状态图像返回到正常状态。如何将btn1的图像保留为选中图像,直到按下其他2个按钮之一?
3个回答

4
你所做的是为“高亮”状态设置图像,这就是为什么当你按下它时可以看到你的图像。
你想要做的是:
1)为选定状态设置图像
2)使用助理视图(在故事板上,右上角第二个方块),为你的视图控制器创建属性(只需将按钮拖动到标题中即可)
3)在按钮操作类型的方法中进行操作:
button.selected = !button.selected;

(显然,将按钮替换为您命名的属性)

谢谢,这个可行,但只解决了我问题的一部分,即按钮确实改变了图像并保持了改变的状态,但只有在再次点击该按钮时才会返回到正常状态图像,而不是在点击任何其他按钮时。 - OccamsRazor
2
当然,这些按钮彼此之间没有关联,你必须自己编写逻辑。例如,在第二个按钮的操作中添加button1.selected = NO; button3.selected=NO; - Pochi
好的,谢谢,我在想这是否是正确的方法。现在已经做了。谢谢。顺便问一下,如果我使用这种方法而不是选项卡栏,根据您的了解,是否会出现应用程序批准方面的问题? - OccamsRazor
只要有合理的理由,是可以自定义选项卡栏的。 - Pochi

3

以下是我的操作步骤:

  1. Link all 3 buttons to the following action method
  2. Create array of all 3 buttons
  3. Set the button that invoked the method to selected
  4. Set the other 2 buttons to not selected

    - (IBAction)buttonPressed:(id)sender
    {
        NSArray* buttons = [NSArray arrayWithObjects:btn1, btn2, btn3, nil];
        for (UIButton* button in buttons) {
            if (button == sender) {
                button.selected = YES;
            }
            else {
                button.selected = NO;
            }
        }
    }
    
希望这可以帮到你。祝好!
干杯!

1
为了保持按钮选中状态,您需要在按钮调用的方法中调用setSelected:YES。例如:
- (void) methodThatYourButtonCalls: (id) sender {
        [self performSelector:@selector(flipButton:) withObject:sender afterDelay:0.0];


}

- (void) flipButton:(UIButton*) button {
    if(button.selected) 
        [button setSelected:NO];
    else
        [button setSelected:YES];

}

我知道使用performSelector:而不是直接调用[sender setSelected:YES]看起来有点奇怪,但后者从来没有对我起作用,而前者却可以!

为了让按钮在按下其他按钮时取消选择,我建议添加一个实例变量,它保存指向当前选定按钮的指针,这样当触摸新按钮时,您可以调用flipButton:相应地取消选择旧按钮。现在您的代码应该如下:

在您的界面中添加一个指针。

@interface YourViewController : UIViewController
{
    UIButton *currentlySelectedButton;
}

将这些方法添加到您的实现中。
- (void) methodThatYourButtonCalls: (id) sender {
    UIButton *touchedButton = (UIButton*) sender;

    //select the touched button 
    [self performSelector:@selector(flipButton:) withObject:sender afterDelay:0.0]; 

    if(currentlySelectedButton != nil) { //check to see if a button is selected...
        [self flipButton:currentlySelectedButton];

    currentlySelectedButton = touchedButton;
}

- (void) flipButton:(UIButton*) button {
    if(button.selected) 
        [button setSelected:NO];
    else
        [button setSelected:YES];

}

谢谢您的帮助,但是当我按下按钮时,应用程序会崩溃,并显示未捕获异常错误,无法识别的选择器发送到实例。 - OccamsRazor
确保在为按钮设置目标时,调用选择器“methodThatYourButtonCalls:”而不是“methodThatYourButtonCalls”(请注意,如果您打算使用 :(id) sender 参数,则必须有分号)。 - Kpmurphy91

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