【问题标题】:Select / deselect UIButton when tapped点击时选择/取消选择 UIButton
【发布时间】:2014-09-12 11:09:14
【问题描述】:

我有一个简单的问题,我似乎找不到答案。

我有几个UIButtons,它们存储在NSArray 中,当它们被点击时,for 循环设置button.selected = YES。我需要在点击同一个按钮时取消选择它,但我似乎无法在网上找到任何帮助。这是我的代码:

- (IBAction)buttonPressed:(UIButton *)sender {
    NSArray *buttons = [NSArray arrayWithObjects:_asbBtn, _vwfBtn, _bpBtn, _rtaBtn, _mslmBtn, _pbaBtn, _rcfBtn, _mspBtn, _wpBtn, _aawBtn, _ppiBtn, _convBtn, nil];

    // Select buttons
    for (UIButton *button in buttons) {
        if (button == sender) {
            button.selected = YES;
        }
    }
}

也许这不是最好的方法,如果我遗漏了一些简单的东西,对不起。我尝试添加else { button.selected = NO;,但这仅允许选择一个按钮并取消选择所有其他按钮。请有人指导我在正确的方向上点击时取消选择当前选择的按钮。

【问题讨论】:

    标签: ios objective-c uibutton xcode5


    【解决方案1】:

    如果您想在每次单击UIButton 实例时在 selected 和 unselected 状态之间切换,可以使用下面的 Objective-C 代码:

    - (IBAction) buttonPressed:(id)sender {
        if ([sender isSelected]) {
            [sender setSelected: NO];
        } else {
            [sender setSelected: YES];
        }
    }
    

    请注意,您可以通过更短的实现获得相同的结果:

    - (IBAction) buttonPressed:(id)sender {
        [sender setSelected: ![sender isSelected]];
    }
    

    使用 Swift 3,您将使用以下代码:

    @IBAction func buttonPressed(_ sender: UIButton) {
        sender.isSelected = !sender.isSelected
    }
    

    【讨论】:

    • 感谢回复,我喜欢短代码版本,所以我会实现它!
    【解决方案2】:

    你为什么要那样做?那太复杂了。简单的方法就是这样做

    - (IBAction)reasonTapped:(id)sender 
    {
        // Personal preference here but I would check to make sure
        // that the sender is actually a button.
        if([sender isKindOfClass:[UIButton class]]) {
            // Sender will be the button that is pressed.
            if([sender isSelected]) {
                // If already selected then set to selected to NO
                [sender setSelected:NO];
            } else {
                // Else set to selected to YES
                [sender setSelected:YES];
            } 
        } else {
            // Else if not an instance of UIButton throw some sort of warning.
        }
    }
    

    如果您在代码或界面/故事板中正确链接了所有按钮,则当用户按下按钮时,它将调用此方法,sender 将是按下的那个按钮。所以一开始不需要冗余数组。

    【讨论】:

    • 感谢您的解释。你是对的,看起来我把一个简单的任务复杂化了。我对你的答案投了赞成票,因为它是一个有用的解释,但我决定只使用 POB 的一行实现。
    • 没关系,看你哪一个更有帮助。良好的编码。
    【解决方案3】:

    用这个 IBAction 绑定所有按钮

    - (IBAction)buttonPressed:(UIButton *)sender 
    {
        if ([sender isSelected]) {
            [sender setSelected:NO];
        }
        else
        {
            [sender setSelected:YES];
        } 
    }
    

    【讨论】:

      【解决方案4】:

      试试这个代码:

       -(IBAction)reasonTapped:(id)sender{
                 if ([sender isSelected]) {
              [sender setSelected: NO];
          } else {
              [sender setSelected: YES];
          }
         }
      

      【讨论】:

        【解决方案5】:

        我想出了一个非常简单的方法来解决这个问题。我的示例是 2 个按钮,但您可以轻松地为其他按钮添加更多 if 语句。将所有按钮作为属性连接到 .h 文件并命名它们(我做了 button1 和 button2)。将以下代码放在您的 .m 文件中并将其(通过情节提要)连接到所有按钮。确保在设置按钮时为正常的 UIControlStateNormal 和 UIControlStateSelected 设置图像,否则这将不起作用。

        - (IBAction)selectedButton1:(id)sender {
        
        if ([sender isSelected]) {
            [sender setSelected:NO];
        
            if (sender == self.button1) {
                [self.button2 setSelected:YES];
            }
            if (sender == self.button2) {
                [self.button1 setSelected:YES];
            }
        }
        
        else
        {
            [sender setSelected:YES];
        
            if (sender == self.button1) {
                [self.button2 setSelected:NO];
            }
            if (sender == self.button2) {
                [self.button1 setSelected:NO];
            }
        
        }
        

        【讨论】:

          猜你喜欢
          • 2016-10-31
          • 1970-01-01
          • 2011-07-05
          • 1970-01-01
          • 2014-12-05
          • 1970-01-01
          • 2021-12-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多