2015-05-12 75 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爲每個按鈕提供一個對其數據結構部分的弱引用,以便您可以在選擇後直接進入該選項。

相關問題