0

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

我正在使用 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)。我想我在 -(void)recognize:(id)sender... 中遗漏了一个步骤...我应该知道...但它现在完全逃离了我。

/弗拉德

4

1 回答 1

0

循环的每次迭代都分配给button变量。当循环退出时,它只会保存您分配给它的最后一个值。该button变量似乎是一个实例变量——它是类的实例所独有的,而不是按钮所独有的。

做你想做的事的便捷方法是访问senderiOS 为你的方法提供的变量。这包含产生相关事件的对象,在本例中为按钮。

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

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

于 2012-05-22T00:12:12.313 回答