2015-05-12 40 views
0

我已经创建了无线电和复选框按钮编程根据我的网络服务响应,其中按钮的数量变化。iOS:如何处理用一个iBAction动态创建的多个按钮?

以下是代码来创建这些按钮:

for(int j = 0; j < nintOptionCount; j++) 
    { 
     UILabel * lblOption = [[UILabel alloc] initWithFrame: CGRectMake(50, yLabel, 250, 21)]; 
     //lblOption.backgroundColor = [UIColor yellowColor]; 
     lblOption.text = [arrmOptionName objectAtIndex:j]; 
     lblOption.textColor = [UIColor blackColor]; 
     lblOption.font = [UIFont systemFontOfSize:14.0f]; 
     [viewDetail addSubview:lblOption];    


     intOptionId = [[arrmOptionId objectAtIndex:j] intValue]; 

     if (intEventChoice == 1) 
     { 
      btnRadio = [[UIButton alloc]initWithFrame:CGRectMake(5, yLabel, 22, 22)]; 
      [btnRadio addTarget:self action:@selector(radioButtonPress:) forControlEvents:UIControlEventTouchUpInside]; 
      [btnRadio setImage:[UIImage imageNamed:@"btn_radio.png"] forState:UIControlStateNormal]; 
      [btnRadio setTag:intOptionId]; 
      [btnRadio setTitle:[NSString stringWithFormat:@"radio%d%d",intOptionId,intParamId] forState:UIControlStateNormal]; 
      [viewDetail addSubview:btnRadio]; 
     } 
     else 
     { 
      btnCheckBox = [[UIButton alloc]initWithFrame:CGRectMake(5, yLabel, 22, 22)]; 
      [btnCheckBox setImage:[UIImage imageNamed:@"btn_checkbox.png"] forState:UIControlStateNormal]; 
      [btnCheckBox addTarget:self action:@selector(checkBoxButtonPress:) forControlEvents:UIControlEventTouchUpInside]; 
      [btnCheckBox setTag:intOptionId]; 
      [btnCheckBox setTitle:[NSString stringWithFormat:@"check%d,%d",intOptionId,intParamId] forState:UIControlStateNormal]; 
      [viewDetail addSubview:btnCheckBox]; 
     } 

     yLabel = yLabel+ 21+10; 
    } 

所以,我的问题是如何在这里以编程方式创建按钮,这些按钮处理措施?以及如何处理按钮的选择和取消选择,因为这些按钮像单选按钮和复选框按钮一样工作。 如果我选择了一个单选按钮,则需要取消选择其他选项,如果是复选框,则需要管理复选框的选择和取消选择。

我已经尝试将按钮设置为按钮,但它不能像我期望的那样正常工作。

请给我提供一些解决方案。 在此先感谢。

+0

一种选择是制作一个包含所有按钮的数组,给它们标签。现在,当选择一个按钮时,循环访问数组并取消选择所有其他按钮用于单选按钮大小写。 –

+0

@Bhagyashreemahajan为每个按钮分配标签。并从标签中轻松找到您点击的是哪一个。 –

+0

@Bhumit是否能够为您的解决方案提供一些示例代码,以便我对此有清晰的认识。 –

回答

0

你必须在for循环中声明你的按钮。所以每次循环运行一个新的按钮实例都会生成。

创建数组以保存按钮。

NSMuttableDictionary *btnRadioDictionary = [NSMutableDictionary new]; 
NSMuttableDictionary *btnCheckBoxDictionary= [NSMutableDictionary new]; 

的内部循环每个按钮设置标签

for(int j = 0; j < nintOptionCount; j++) 
{ 
UIButton *btnRadio; 
UIButton *btnCheckBox; 
// your other code 


    btnRadio.tag = j; 
    btnCheckBox.tag = j; 

// save buttons to an array 
[btnRadioDictionary setValue:btnRadio forKey:j]; 
[btnCheckBoxDictionary setValue:btnCheckBox forKey:j]; 
} 

,并确定按钮使用标签在IBAction为

-(IBAction) radioButtonPress:(id)sender 
{ 
    // Write code Deselect all button here 
    for(NSString *key in btnRadioDictionary) 
    { 
    UIButton *button =[btnRadioDictionary objectForKey:key]; 
    [button setImage:[UIImage imageNamed:@"btn_radio.png"] forState:UIControlStateNormal]; 
    } 
    // Select required button 

    UIButton *button =[btnRadioDictionary objectForKey:[sender tag]]; 
    [button setImage:[UIImage imageNamed:SELECTED_IMAGE_FOR_RADIO_BUTTON] forState:UIControlStateNormal]; 

    //Write separate action for each button if required. 

    switch ([sender tag]) { 
    case 0: 

     break; 
    case 1: 

     break; 
    case 2: 

     break; 
     /* 
     ................. 
     */ 
    default: 
     break; 
    } 
} 
+0

谢谢,但我无法使用开关盒,因为我的按钮数量因Web服务响应而异。所以我不知道我应该写多少个开关盒。 –

+0

谢谢..它工作.. :) –

0

您应该创建一个数据结构点击,无论是从数组和字典或自定义类,以允许您表示您的按钮组,它们的类型以及它们的当前选择状态。该数据结构可以直接链接到按钮,以便在更新时可以迭代组中的按钮来更新它们。

使用tag是获取关于所选按钮的信息的作弊方式,但它便宜又方便。子类化按钮也很困难。另一种方法是使用associated objects为每个按钮提供一个对其数据结构部分的弱引用,以便您可以在选择后直接进入该选项。

相关问题