我的iPhone應用程序有很多按鈕,我希望所有的按鈕都調用相同的方法,但使用不同的參數。將不同的參數傳遞給IBAction
例如我想點擊一個按鈕調用方法myMethod:
與參數@"foo"
,第二個按鈕應調用相同的方法,但參數@"bar"
。
我的iPhone應用程序有很多按鈕,我希望所有的按鈕都調用相同的方法,但使用不同的參數。將不同的參數傳遞給IBAction
例如我想點擊一個按鈕調用方法myMethod:
與參數@"foo"
,第二個按鈕應調用相同的方法,但參數@"bar"
。
所謂的「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";
...
}
給你的各種UIButton
實例不同的tag
屬性值。如果你想使這個易於維護
- (void) myMethod:(id)sender {
switch (sender.tag) {
case (firstButtonTag):
doFooStuff;
break;
case (secondButtonTag):
doBarStuff;
break;
// etc.
}
}
值firstButtonTag
和secondButtonTag
可以存儲在一個enum
:
在你IBAction
方法-myMethod:
,你可能會那麼做這樣的事情。
您無法通過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]);
}
}
你不知道。唯一的參數是發送者對象,您可能會使用它來產生不同的行爲,但是我要做的是定義2個動作方法,它們依次調用具有不同參數的相同方法,例如:
- (IBAction)button1:(id)sender
{
[self doStuff:kButton1];
}
- (IBAction)button2:(id)sender
{
[self doStuff:kButton2];
}
- (void)doStuff:(ParamType)param;
{
...
}
在該方法中的防禦(沒有雙關語意),我想補充一點,它使更清晰,當你查看與Interface Builder中你的UI地看到,不同的按鈕,其實有不同的效果,這是很難說,如果他們所有呼叫任何行動:
正如其他人已經提到你不能傳遞你的自定義參數到行動方法。如果你不喜歡使用標籤的解決方案,你也可以用你的自定義類繼承UIButton並在那裏添加你的參數。 (由我不會打擾,只是使用標籤)
真正的原因你不能添加額外的參數是UIKIT將推棧上的參數。 所以唯一的方法是使用標籤。 一個骯髒的方式可以是一個指針爲int和標記按鈕轉換它:
myStruct params;
// fill params:
params.x=....
params.y=....
params.z=....
UIButton * btn = [UIButton......]; // create or use one from XIB
btn.tag = (int)¶ms;
... in Call back:
-(IBActions) doIt:(id)sender
{
myStruct * paramsPtr = (myStruct*)tag;
int i = paramsPtr->x;
注:PARAMS必須要保持靜態..或使用malloc(越來越多的醜陋的代碼...)分配。 不要使用局部變量:它將被分配到棧上,所以在從設置方法退出後將被刪除。
這是一個可怕的想法,並在公共論壇推薦它也是一個壞主意。 – 2016-07-27 17:44:30
(ID),發件人是顯示,無論ü傳遞UIButton的點擊事件被直接傳遞給此方法,也不管它是什麼類型的,它會自動一樣,如果您通過按鈕標籤則需要按鈕標籤作爲發件人承擔。標籤等
完美!正是我期待的答案。謝謝! – Quentamia 2011-05-18 15:16:39