2010-09-22 51 views
0

我正在創建一個帶有動作功能的欄按鈕列表(sFuncName,如下所示),它是動態更改的。動態聲明函數名稱?

當用戶點擊一個按鈕時,sFuncName將被調用。

for(int i = 0; i < 3 ; i++){ 

     NSString* sFuncName = [NSString stringWithFormat:@"OnFunc_%d:", i ]; 
     barButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:systemItem target:self 
        action:NSSelectorFromString(sFuncName)]; 
} 

的問題是:有我有什麼辦法來動態聲明sFuncName對按鍵反應?

實施例:

for(int i = 0; i < 3 ; i++){ 

     NSString* sFuncName = [NSString stringWithFormat:@"OnFunc_%d:", i ]; 
     - (void)sFuncName: (id)sender; //sFuncName: OnFunc_0, OnFunc_1, OnFunc_2 
} 

回答

4

我沒有看到動態創建的方法聲明,因爲這些方法中的代碼將不動態任一的優點。

所以你應該聲明一個方法,每個按鈕都會調用一個方法,你可以通過它傳遞一個標籤或引用發件人(按鈕)或其他一些值,使你的方法可以告訴哪個按鈕已被點擊在調用方法之前。你可以做這樣的事情:

-(void)buttonPressed: (int)tag { 

    if (tag == 0) { 
     // Code for first button 
    } 

    if (tag == 1) { 
     // Code for second button 
    } 

    // prepare code for further buttons... 

} 
+0

感謝您的評論。 – cruccruc 2010-10-02 11:27:22

0

你真的不應該這樣做,這是不好的編碼實踐,我保證你在開發某些時候,你會後悔的。另一方面,你可以做的是處理有塊的東西(比如你聲明內聯和堆棧的函數)。

你將宣佈一個塊直列類似的東西:

void (^doStuff)(int, char *) = ^(int arg0, char *arg1) { 
    printf("hello block"); 
}; 

doStuff(1, "a"); 
doStuff(2, "b"); 
... 

你可以做的是讓你的按鈕的子類,在點擊執行給定塊語句。

更多關於方塊:developer.apple.com