簡體   English   中英

iOS:如何處理通過一個iBAction動態創建的多個按鈕?

[英]iOS: How to handle multiple buttons created dynamically with one iBAction?

我已經根據我的Web服務響應以編程方式創建了單選按鈕和復選框按鈕,按鈕的數量各不相同。

以下是創建這些按鈕的代碼:

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;
    }

因此,我的問題是如何處理對以編程方式創建按鈕的那些按鈕的操作? 以及如何處理按鈕的選擇和取消選擇,因為這些按鈕的工作方式類似於單選按鈕和復選框按鈕。 在單選按鈕的情況下,如果我選擇一個,則需要取消選擇其他按鈕;在復選框的情況下,需要管理復選框的選擇和取消選擇。

我嘗試將標簽設置為按鈕,但未按預期正常工作。

請給我一些解決方案。 提前致謝。

您必須在for循環中聲明按鈕。 因此,每個時間循環運行都會生成一個新的button實例。

創建數組以保存按鈕。

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;
   }
}

您應該根據數組和字典或自定義類創建數據結構,以表示按鈕組,按鈕的類型和當前的選擇狀態。 此數據結構可以直接鏈接到按鈕,以便在進行更新時可以迭代組中的按鈕以更新它們。

使用tag是獲取有關所選按鈕信息的一種作弊方法,但它既便宜又方便。 也很難將按鈕歸類。 一種替代方法是使用關聯的對象為每個按鈕提供對其數據結構部分的弱引用,因此您可以在選擇后直接進入該按鈕。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM