【问题标题】:custom RadioButton selected one at a time for iphone?为 iphone 一次选择一个自定义 RadioButton?
【发布时间】:2012-07-03 12:37:06
【问题描述】:

我已经动态地创建了一些带有一些值的 RadioButtons 列表。以编程方式,我更改了按钮状态并更改了选中和未选中的图像。但问题是我可以同时选择所有单选按钮。实际上我需要一次选择一个。 当我单击下一个 RadioButton 时,之前选择的按钮状态应更改为未选择。

这是我的代码,我尝试更改图像,但是……我的代码有问题。

   RadioButton = [UIButton buttonWithType:UIButtonTypeCustom];
   [RadioButton setFrame:CGRectMake(0.0f, 0.0f, 20, 20)];
   [RadioButton setCenter:CGPointMake(116.0,p1)];
   [RadioButton setSelected:NO];
   [RadioButton setImage:[UIImage imageNamed:@"uncheck.png"] forState:UIControlStateNormal];
   [RadioButton addTarget:self action:@selector(RadioButtonTapped:) forControlEvents:UIControlEventTouchUpInside];
   [self.scrollView addSubview:RadioButton];




  -(void)RadioButtonTapped:(id)sender
    {


       UIButton *RadioButton1 = (UIButton*)sender ;

      [self radiobuttonAction:RadioButton1];
    }

 -(void)radiobuttonAction:(UIButton *)Button
    {

       if(![Button isSelected])
         {


            [Button setSelected:YES]; 
            [Button setImage:[UIImage imageNamed:@"radio_active.png"] forState:UIControlStateSelected]; //not working, button image is not changing 
        } 
     else
        { 
            [Button setSelected:NO]; 
            [Button setImage:[UIImage imageNamed:@"radio_inactive.png"] forState:UIControlStateNormal];
        }


 }

在哪里可以更改之前选择的按钮的图像。

提前致谢

【问题讨论】:

  • 如何在按钮上制作插座,例如你有3个按钮,制作3个插座,这样很容易解决你的问题。
  • 但我是动态创建按钮的,
  • RadioButtonTapped-- 在这个,你在每个按钮中都使用这个吗?
  • 是的,当我们按下任何单选按钮时,将调用点击操作。

标签: iphone radio-button state selected


【解决方案1】:

当您选择一个按钮时,取消选择所有按钮。如果您的滚动视图中有按钮,您可以使用以下代码:

//Your Method
-(void)RadioButtonTapped:(id)sender
{
  UIButton *RadioButton1 = (UIButton*)sender;
  [self deselectAll];
  [self radiobuttonAction:RadioButton1];      
}

- (void) deselectAll : (UIScrollView *) scrollView{
  NSArray *viewArray = [scrollView subviews];
  for (UIView *v in viewArray){
  if([v isKindOfClass:[UIButton class]]){
        [((UIButton *)v) setSelected:NO];
  }
 }
}

编辑:但如果你想给它真正的单选按钮效果(其中一个总是被选中,并且只选中一个),你会更容易。使用以下代码:

 //A globle refButton
  UIButton *refButton = nil;
 //Set image for both state:
[RadioButton setImage:[UIImage imageNamed:@"uncheck.png"] forState:UIControlStateNormal];
[RadioButton setImage:[UIImage imageNamed:@"check.png"] forState:UIControlStateSelected];

 //make any of above default select: may be the last one and pass that to `refButton`
 refButton = RadioButton;



 //Your Method
-(void)RadioButtonTapped:(id)sender
{
  [refButton setSelected:NO];
  refButton = (UIButton*)sender;
  [refButton setSelected:YES];      
}

【讨论】:

  • 但是,还有一个疑问,我只是 nsloged 标签值 NSLog(@"%d",refButton.tag);,但标签值始终显示为 0。因为我需要标签值来检索对应的数据,怎么可能
  • 您在添加按钮时是否已将标签值添加到按钮中?如果没有,那么就这样做。如果问题仍然存在,请告诉我。
【解决方案2】:

在创建时标记按钮。 当点击按钮时,通过标签获取按钮。取消选择所有按钮。更新您作为 n 参数收到的当前按钮。

【讨论】:

    【解决方案3】:

    假设您要添加 5 个单选按钮。

     - (void)viewDidLoad
     {
          for (int i = 0; i < 5; i++) {
               UIButton*  RadioButton = [UIButton buttonWithType:UIButtonTypeCustom];
               [RadioButton setFrame:CGRectMake(0.0f, 0.0f, 20, 20)];
               [RadioButton setCenter:CGPointMake(116.0, i * 40)];
               //        [RadioButton setTag:i * 10];
               [RadioButton setSelected:NO];
               [RadioButton setImage:[UIImage imageNamed:@"unCheck.png"] forState:UIControlStateNormal];
               [RadioButton addTarget:self action:@selector(RadioButtonTapped:) forControlEvents:UIControlEventTouchUpInside];
               [self.scrollView addSubview:RadioButton];
    
         }
      }
    
    //do not forget to declared this in your header file
    -(void)RadioButtonTapped:(UIButton*)button;
     {
           for (UIButton *btn in self.scrollView.subviews) {
              [btn setImage:[UIImage imageNamed:@"unCheck.png"] forState:UIControlStateNormal];
             }
           [button setImage:[UIImage imageNamed:@"check.png"] forState:UIControlStateNormal];
     }
    

    上面的代码更新了 UI,将所有按钮的图像设置为“取消选中”,然后将最后按下的按钮的图像更改为“选中”。

    【讨论】:

    • 感谢您的反馈,它适用于 rptwsthis 解决方案。
    【解决方案4】:

    像这样创建按钮,

    for(int i=0;i<4;i++)
    {
     RadioButton = [UIButton buttonWithType:UIButtonTypeCustom];
     RadioButton.tag = i*100;
     [RadioButton setFrame:CGRectMake(0.0f, 0.0f, 20, 20)];
     [RadioButton setCenter:CGPointMake(116.0,p1)];
     [RadioButton setSelected:NO];
     [RadioButton setImage:[UIImage imageNamed:@"uncheck.png"] forState:UIControlStateNormal];
     [RadioButton addTarget:self action:@selector(RadioButtonTapped:) forControlEvents:UIControlEventTouchUpInside];
     [self.scrollView addSubview:RadioButton];
    
    }
    

    添加这样的操作,

    -(void)radiobuttonAction:(UIButton *)Button
    {
    
       UIButton *Button = (UIButton*)sender;
       for(UIButton * btn in self.scrollview.subViews)
       {
         if(btn.tag == Button.tag)
         {
            if(![Button isSelected])
            {
              [Button setSelected:YES]; 
              [Button setImage:[UIImage imageNamed:@"radio_active.png"] forState:UIControlStateSelected]; //not working, button image is not changing 
            } 
            else
            { 
              [Button setSelected:NO]; 
              [Button setImage:[UIImage imageNamed:@"radio_inactive.png"] forState:UIControlStateNormal];
            }
         }
         else
        {
          //do selected or de-selected code for other buttons
    
        }
    
    }
    

    【讨论】:

    • 您能描述一下为什么将标签更改为 RadioButton.tag = i*100; ,结果应该是什么?
    • 它现在可以与 rptwsthis 解决方案一起使用。感谢您的反馈
    猜你喜欢
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    • 2014-03-13
    • 1970-01-01
    相关资源
    最近更新 更多