从循环中识别UIButton

时间:2012-05-22 00:00:50

标签: iphone loops uibutton

我看到一个问题/答案的结果与我正在寻找的结果类似,但所讨论的代码比我现在复杂得多。

我使用for()循环从数组中创建一堆按钮。然后,我有一个动作,但我无法识别按钮。所以:

NSArray *numbers = [NSArray arrayWithOjbects:@"1", "2", "3", nil];

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

   button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
   [button addTarget:self action:@selector(recognize:) forControlEvents:UIControlEventTouchDown];
   [button setTitle:[numbers objectAtIndex:i] forState:UIControlStateNormal];
   button.frame = CGRectMake(x, y, w, l);

   }

然后:

-(void) recognize:(id)sender {

   NSLog (button.titleLabel.text);

 }

但是,无论按下按钮,我只获得数组(3)的最后一个成员。我想我错过了一步 - (无效)认识:(id)发件人......我应该知道......但它现在完全逃脱了我。

/维拉德

1 个答案:

答案 0 :(得分:0)

循环的每次迭代都会分配给button变量。退出循环时,它将只保留您分配给它的最后一个值。 button变量似乎是一个实例变量 - 它对于类的实例是唯一的,而不是按钮。

执行所需操作的便捷方法是访问iOS提供给您的方法的sender变量。这包含产生相关事件的对象,在本例中为按钮。

NSLog (@"%@", ((UIButton *)sender).titleLabel.text);

另请注意,以这种方式记录文本值是不可接受的。如果它包含一个格式字符串(例如%@),它将期望一个它没有得到的进一步的参数,并且会崩溃。 这可能是一个安全漏洞。当您有一个要记录的字符串变量时,请使用%@进行记录,如上所述。 Xcode应该已经警告过你了。不要忽视警告。