【问题标题】:How to track several selected buttons?如何跟踪几个选定的按钮?
【发布时间】:2013-08-01 12:26:08
【问题描述】:

我有两个按钮,一个带有标签 0,另一个带有标签 12,还有一个 NSMutableString buttonPressings。 我想要下一个:如果选择了其中一个按钮,或者同时选择了两个按钮,我将字符串中的第一个数字设置为 1。 如果两个都没有选择,我将其设置为 0。

我的代码是下一个:

- (IBAction)buttonPressed:(UIButton *)button {
button.selected = !button.selected;

if ((button.tag==0 && button.selected) || (button.tag==12 && button.selected))
{
    NSRange range = {0,1};
    [buttonPressings replaceCharactersInRange:range withString:@"1"];
}

else if ((button.tag==0 && !button.selected) && (button.tag==12 && !button.selected))
{
     NSRange range = {0,1};
    [buttonPressings replaceCharactersInRange:range withString:@"0"];
}

}

它不工作。这里有什么问题? 谢谢!

【问题讨论】:

  • 您只检查被按下的按钮的状态。您必须检查两个按钮,例如if (button1.selected || button2.selected) ...
  • 但是我没有button1和button2,我通过标签来引用它们。

标签: ios cocoa-touch uibutton


【解决方案1】:

它不起作用,因为您只需按一下按钮就会收到通知。例如,如果您按下标签为 0 的按钮,则将使用按钮 0 作为参数调用 buttonPressed: 方法。您正在测试是否在 if 表达式中选择了两次按钮:button.selected。但这两次都只会检查最近按下的按钮。

if ((button.tag==0 && button.selected) || (button.tag==12 && button.selected))

您必须独立测试每个按钮的状态... 例如,您可以创建两个存储指向按钮的指针的出口变量。把它放在你的视图控制器头文件中:

@property (weak, nonatomic) IBOutlet UIButton *button0;
@property (weak, nonatomic) IBOutlet UIButton *button12;

然后使用布局设计器将您的插座连接到这些按钮。之后,您可以访问其中任何一个的 .selected 属性。

- (IBAction)buttonPressed:(UIButton *)button {
    button.selected = !button.selected; // i'm not sure of this line

    if ((button.tag==0 || button.tag==12)
    {
        if( button0.selected || button12.selected )
        { // one of them is selected
            NSRange range = {0,1};
            [buttonPressings replaceCharactersInRange:range withString:@"1"];
        } else { // none is selected
            NSRange range = {0,1};
            [buttonPressings replaceCharactersInRange:range withString:@"0"];
        }      
    }
}

或者,如果您想避开这些网点,请查看this question。您可以通过其标签获得一个视图,例如一些 UIButton。如果你的视图控制器中有一个视图属性,你可以这样写:

- (IBAction)buttonPressed:(UIButton *)button {
    button.selected = !button.selected; // i'm not sure of this line

    if ((button.tag==0 || button.tag==12)
    {
        UIButton *button0 = (UIButton *)[self.view viewWithTag:0];
        UIButton *button12 = (UIButton *)[self.view viewWithTag:12];

        if( button0.selected || button12.selected )
        { // one of them is selected
            NSRange range = {0,1};
            [buttonPressings replaceCharactersInRange:range withString:@"1"];
        } else { // none is selected
            NSRange range = {0,1};
            [buttonPressings replaceCharactersInRange:range withString:@"0"];
        }      
    }
}

【讨论】:

  • 谢谢。你能更清楚地解释一下为什么我的方法行不通吗? “只需按一下按钮就会收到通知,您必须独立测试每个按钮的状态......” - 我没有完全理解。
  • 我马上就想到了这种方式,但有没有可能以我的方式实现呢?所有按钮只有一个插座
  • 我已经编辑了我的问题,然后我想知道它是否有帮助
  • 你是对的,奥特莱斯的方式似乎更容易。但是,我还有两个问题:1)为什么我们需要标签呢?为什么不只是if (button0.selected) {...}? 2)这段代码似乎在这里不起作用,无论有标签还是没有标签。 XCode 给了我:“使用未声明的标识符 'button0';你的意思是 '_button0'?”,而我已经创建了插座并将它们连接到按钮。抱歉,如果我的问题太无聊,非常感谢您的帮助。
  • self.button0实际上是对button0属性getter的调用,也许button0属性后面的变量_button0将作为普通变量工作。
【解决方案2】:

再次检查您的代码。

else if ((button.tag==0 && !button.selected) && (button.tag==12 && !button.selected))

它同时检查条件 button.tag 的 0 和 12 ,所以为此你必须将两个按钮都作为对象。

试试这个

- (IBAction)buttonPressed:(UIButton *)button
{
    button.selected = !button.selected;

    if (button.tag==0 || button.tag==12)
        {
            UIButton *firstBtn = (UIButton *)[button viewWithTag:0];
            UIButton *secondBtn = (UIButton *)[button viewWithTag:12];

            if( firstBtn.selected || secondBtn.selected )
            { // one of them is selected
                NSRange range = {0,1};
                [buttonPressings replaceCharactersInRange:range withString:@"1"];
            } else { // none is selected
                NSRange range = {0,1};
                [buttonPressings replaceCharactersInRange:range withString:@"0"];
            }      
        }
}

【讨论】:

  • 你确定吗?在第一个“if”中,对,我放置||,因为它是“一个按钮或另一个”。但是,在“else if”中,它是“两者都不是”,所以 && 很好,不是吗?
  • 感谢您的回答。 button.selected = !button.selected; - 你能评论一下这条线是干什么用的吗?
  • 如果您再次按下按钮,则使用此行。然后设置选择是或否
  • 谢谢。您也可以看看其他答案吗?也许你可以给我一些关于出口方式的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-18
  • 2011-05-04
  • 2015-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多