2010-01-22 69 views
12

我的iPhone應用程序有很多按鈕,我希望所有的按鈕都調用相同的方法,但使用不同的參數。將不同的參數傳遞給IBAction

例如我想點擊一個按鈕調用方法myMethod:與參數@"foo",第二個按鈕應調用相同的方法,但參數@"bar"

回答

27

所謂的「IBActions」必須具有以下特徵之一:

-(void)action; 
-(void)actionWithSender:(id)sender; 
-(void)actionWithSender:(id)sender event:(UIEvent*)event; 

不能添加任何其他參數。不過你可以使用sender(這是按鈕1或BUTTON2在你的情形),以獲取參數:

-(void)actionWithSender:(UIButton*)sender { 
    NSString* parameter; 
    if (sender.tag == 1) // button1 
    parameter = @"foo"; 
    else     // button2 
    parameter = @"bar"; 
    ... 
} 
+0

完美!正是我期待的答案。謝謝! – Quentamia 2011-05-18 15:16:39

1

給你的各種UIButton實例不同的tag屬性值。如果你想使這個易於維護

- (void) myMethod:(id)sender { 
    switch (sender.tag) { 
     case (firstButtonTag): 
      doFooStuff; 
      break; 
     case (secondButtonTag): 
      doBarStuff; 
      break; 
     // etc. 
    } 
} 

firstButtonTagsecondButtonTag可以存儲在一個enum

在你IBAction方法-myMethod:,你可能會那麼做這樣的事情。

1

您無法通過IBAction爲傳遞參數。我通常做的是給這些按鈕在IB中的唯一標籤。標籤是一個整數值,所以我使用一個簡單的查找表將標籤轉換爲某個值。

在這種情況下,三個按鈕,但標籤1到3:

- (IBAction) buttonPressed: (UIButton*) sender 
{ 
    static const NSString* names = { @"Foo", @"Bar", @"Baz" }; 
    id tag = [sender tag]; 
    if (tag >= 1 && tag <= 3) { 
     NSLog(@"Button pressed is %@", names[tag]); 
    } 
} 
-1

你不知道。唯一的參數是發送者對象,您可能會使用它來產生不同的行爲,但是我要做的是定義2個動作方法,它們依次調用具有不同參數的相同方法,例如:

- (IBAction)button1:(id)sender 
{ 
    [self doStuff:kButton1]; 
} 

- (IBAction)button2:(id)sender 
{ 
    [self doStuff:kButton2]; 
} 

- (void)doStuff:(ParamType)param; 
{ 
    ... 
} 

在該方法中的防禦(沒有雙關語意),我想補充一點,它使更清晰,當你查看與Interface Builder中你的UI地看到,不同的按鈕,其實有不同的效果,這是很難說,如果他們所有呼叫任何行動:

0

正如其他人已經提到你不能傳遞你的自定義參數到行動方法。如果你不喜歡使用標籤的解決方案,你也可以用你的自定義類繼承UIButton並在那裏添加你的參數。 (由我不會打擾,只是使用標籤)

2

真正的原因你不能添加額外的參數是UIKIT將推棧上的參數。 所以唯一的方法是使用標籤。 一個骯髒的方式可以是一個指針爲int和標記按鈕轉換它:

myStruct params; 
// fill params: 
params.x=.... 
params.y=.... 
params.z=.... 


UIButton * btn = [UIButton......]; // create or use one from XIB 
btn.tag = (int)&params; 

... in Call back: 
-(IBActions) doIt:(id)sender 
{ 
    myStruct * paramsPtr = (myStruct*)tag; 
    int i = paramsPtr->x; 

注:PARAMS必須要保持靜態..或使用malloc(越來越多的醜陋的代碼...)分配。 不要使用局部變量:它將被分配到棧上,所以在從設置方法退出後將被刪除。

+0

這是一個可怕的想法,並在公共論壇推薦它也是一個壞主意。 – 2016-07-27 17:44:30

1

(ID),發件人是顯示,無論ü傳遞UIButton的點擊事件被直接傳遞給此方法,也不管它是什麼類型的,它會自動一樣,如果您通過按鈕標籤則需要按鈕標籤作爲發件人承擔。標籤等