如何为数组中的每个创建一个具有唯一图像和选择器的自定义 UIButton?

Posted

技术标签:

【中文标题】如何为数组中的每个创建一个具有唯一图像和选择器的自定义 UIButton?【英文标题】:How to make a custom UIButton with a unique image and selector for each from an array? 【发布时间】:2012-12-05 15:50:33 【问题描述】:

我有几个从 NSMutableArray 创建的 UIButton。我正在尝试使用独特的图像自定义每个 UIButton。

在以下行中,我不确定用于分别为图像数组中的每个按钮设置图像的语法:

[btn setImage:[UIImage imageNamed:[myImages objectAtIndex:3]] forState:UIControlStateNormal];

这是我的其余代码:

NSMutableArray* buttonArray = [[NSMutableArray alloc] init];

for(int i = 0; i < 8; i++)

    // Custom UIButton
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];

    [btn setFrame:CGRectMake(0.0f, 2.0f, 52.0f, 52.0f)];
    [btn setTitle:[NSString stringWithFormat:@"Button %d", i+1] forState:UIControlStateNormal];

    NSArray * myImages = [NSArray arrayWithObjects:@"category0.png", @"category-clothing1.png" , @"category2.png", @"category3.png", nil];

    [btn setImage:[UIImage imageNamed:[myImages objectAtIndex:3]] forState:UIControlStateNormal];

    [btn addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
    [buttonArray addObject:btn];


我还希望为每个按钮调用不同的选择器。

【问题讨论】:

您确定为每个按钮设置相同的操作吗?你也可以改变它..我想你一定知道该怎么做。 您的图像是否已添加到您正在构建的目标中?右侧栏中有一个复选框,供他们指定成员资格。它在模拟器而不是设备中工作吗?如果是这样,请检查大小写,有时模拟器不那么挑剔。 @AnoopVaidya 我还需要为每个取消按钮设置一个独特的操作,谢谢:) @Josh 图片添加得很好。问题是它们都是相同的图像。我希望它通过图像数组并为button1添加image1,为button2添加image2等...... @hanumanDev 在这种情况下,我的答案需要投票和接受:p 【参考方案1】:

这样的?我刚刚看到您关于每个按钮需要不同操作的帖子,但我会检查按钮的发送者并在您的 (buttonPressed:) 方法中相应地调整代码。您还应该确保您的按钮阵列具有适当数量的图像,因此更好的方法可能是仅根据您的图像阵列计数创建按钮数量。 (答案已编辑以反映这一点)。我还想补充一点,您应该养成在更改正常状态时也更改图像突出显示状态的习惯,这样当您按下图像时它不会变为空白。

NSMutableArray* buttonArray = [NSMutableArray array];
NSArray * myImages = [NSArray arrayWithObjects:@"category0.png", @"category-clothing1.png" , @"category2.png", @"category3.png", nil];

for(int i = 0;i < [myImages count]; i++)

    // Custom UIButton
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];

    [btn setFrame:CGRectMake(0.0f, 2.0f, 52.0f, 52.0f)];
    [btn setTitle:[NSString stringWithFormat:@"Button %d", i] forState:UIControlStateNormal];
    [btn setImage:[UIImage imageNamed:[myImages objectAtIndex:i]] forState:UIControlStateHighlighted];
    [btn setImage:[UIImage imageNamed:[myImages objectAtIndex:i]] forState:UIControlStateNormal];
    [btn addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
    [buttonArray addObject:btn];

【讨论】:

【参考方案2】:

此代码包含来自数组的图像和选择器。 (此代码未经编译检查,可能存在一些小问题,不便之处敬请见谅)

NSMutableArray* buttonArray = [NSMutableArray array];
NSArray * myImages = [NSArray arrayWithObjects:@"category0.png", @"category-clothing1.png" , @"category2.png", @"category3.png", nil];


// You need to assign string name and that should be your method name.
NSMutableArray *selectors=[[NSMutableArray alloc]initWithArray:@"sel1",@"sel2",@"sel3",@"sel4", nil];


for(int i=0; i<[myImages count]; i++)
    // Custom UIButton
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
    [btn setFrame:CGRectMake(0.0f, 2.0f, 52.0f, 52.0f)];
    [btn setTitle:[NSString stringWithFormat:@"Button %d", i] forState:UIControlStateNormal];
    [btn setImage:[UIImage imageNamed:[myImages objectAtIndex:i]] forState:UIControlStateHighlighted];
    [btn setImage:[UIImage imageNamed:[myImages objectAtIndex:i]] forState:UIControlStateNormal];

    SEL selector = selectorFromString([selectors objectAtIndex:i]);
    [btn addTarget:self action:@selector(selector) forControlEvents:UIControlEventTouchUpInside];

    [buttonArray addObject:btn];

【讨论】:

谢谢!然后该方法看起来如何被调用?我不清楚该方法如何知道 button3 被触摸等。 如果你有 10 个按钮,你将创建 10 个图像,同样你必须为每个按钮创建 10 种不同的方法(如果它们有点相似,那么你可以与其他东西)。并且在选择器数组中所有选择器(提供方法名称),在运行时@selector() 将使用参数say sel1 调用。导致 sel1() 方法将被调用。

以上是关于如何为数组中的每个创建一个具有唯一图像和选择器的自定义 UIButton?的主要内容,如果未能解决你的问题,请参考以下文章

如何为每个数组保存一个图像

如何为图像分割创建带有掩码的自定义图像数据集?(特别是对于 Tensorflow)

如何为 django 中的每个匿名用户提供一些唯一的 id

如何为HSQL中的每个组选择列中具有最大值的行?

如何为列中的每个唯一值获取数据框中的项目数[重复]

如何为 Postgresql 中的所有数据库创建具有只读权限的用户?