2014-09-12 105 views
3

我有一个简单的问题,我似乎无法找到答案。点击时选择/取消选择UIButton

我有几个UIButton s存储在一个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;,但这只允许选择一个按钮并取消选择其他所有按钮。请有人引导我在正确的方向取消选择当前选定的按钮。

回答

11

如果你愿意,你点击一个UIButton每次选择未选择状态之间进行切换例如,您可以使用下面的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 
} 
+1

感谢您的回复,我喜欢短代码版本,所以我会实现它! – rosshump 2014-09-12 11:45:15

1

试试这个代码:

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

绑定与该单IBAction为所有按钮

- (IBAction)buttonPressed:(UIButton *)sender 
{ 
    if ([sender isSelected]) { 
     [sender setSelected:NO]; 
    } 
    else 
    { 
     [sender setSelected:YES]; 
    } 
} 
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将是按钮正确链接所有的按钮了这被按下。所以在开始时不需要冗余阵列。

+0

感谢您的解释。你说得对,看起来我已经完成了一项复杂的简单任务。我已经提出了你的答案,因为这是一个有用的解释,但我已经决定与POB的只执行一行。 – rosshump 2014-09-12 11:46:57

+0

这很好,这取决于你哪一个更有帮助。良好的编码。 – Popeye 2014-09-12 12:10:50

0

我想出了一个很简单的方法来解决这个问题。我的例子是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]; 
    } 

}