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;
}
所以,我的问题是如何处理以编程方式创建按钮的那些按钮上的操作?以及如何处理按钮的 selection 和 deselection,因为这些按钮的工作方式类似于单选按钮和复选框按钮。
在单选按钮的情况下,如果我 select 一个然后另一个需要 deselect 并且在复选框的情况下,selection 和 deselect 复选框的离子需要被管理。
我试过为按钮设置标签,但它没有像我预期的那样正常工作。
请提供一些解决方案。
提前致谢。
您必须在 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;
}
}
您应该从数组和字典或自定义 类 创建一个数据结构,以允许您表示按钮组、它们的类型和它们当前的选择状态。此数据结构可以 link 直接到按钮,以便在进行更新时您可以迭代组中的按钮以更新它们。
使用tag
是一种获取所选按钮信息的作弊方式,但它既便宜又方便。按钮的子类化也很困难。一种替代方法是使用 associated objects 为每个按钮提供对其数据结构部分的弱引用,这样您就可以在选择后直接转到那里。
我根据我的 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;
}
所以,我的问题是如何处理以编程方式创建按钮的那些按钮上的操作?以及如何处理按钮的 selection 和 deselection,因为这些按钮的工作方式类似于单选按钮和复选框按钮。 在单选按钮的情况下,如果我 select 一个然后另一个需要 deselect 并且在复选框的情况下,selection 和 deselect 复选框的离子需要被管理。
我试过为按钮设置标签,但它没有像我预期的那样正常工作。
请提供一些解决方案。 提前致谢。
您必须在 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;
}
}
您应该从数组和字典或自定义 类 创建一个数据结构,以允许您表示按钮组、它们的类型和它们当前的选择状态。此数据结构可以 link 直接到按钮,以便在进行更新时您可以迭代组中的按钮以更新它们。
使用tag
是一种获取所选按钮信息的作弊方式,但它既便宜又方便。按钮的子类化也很困难。一种替代方法是使用 associated objects 为每个按钮提供对其数据结构部分的弱引用,这样您就可以在选择后直接转到那里。