2012-05-22 105 views
0

我見過一個問題/答案,其結果與我正在尋找的結果相似,但討論的代碼比我現在要複雜得多。我使用for()循環來創建一個從數組中的按鈕一堆。然後,我有一個動作,但我無法識別該按鈕。所以:從循環中識別UIButton

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)的最後一個成員,無論按下按鈕的。我想我錯過了一步 - (無效)承認:(身份證)發件人......我應該知道......但它現在完全逃脫了我。

/維拉德

+0

您是否將它們添加到視圖的某個位置?有一個屬性'標籤'用於識別元素。在循環結束時,你應該做一些類似'[self.view addSubview:button]' – DanSkeel

+0

是的,稍後:[board addSubview:button]。我之前忘了添加,因爲它和代碼的其餘部分是重新計算位置。 – Vlad

回答

0

循環的每次迭代分配給button變量。當循環退出時,它將保存您分配給它的最後一個值。 button變量似乎是一個實例變量 - 它對於類的實例是唯一的,而不是按鈕。

做你想做的事的便捷方式是訪問sender變量,這個變量是iOS提供給你的方法的。這包含產生該事件的對象,在這種情況下,該按鈕。

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

另請注意,以這種方式記錄文本值是不可接受的。如果它包含一個格式字符串(如%@),它會期待一個進一步的參數,它不會得到,並會崩潰。 這可能是一個安全漏洞。當你有一個你想記錄的字符串變量時,使用%@來記錄它,如上所述。 Xcode應該已經警告過你。不要忽視警告。

+0

非常感謝你,並適當注意到馬虎使用NSLog。 – Vlad