私の iPhone アプリには多くのボタンがあり、すべてのボタンで同じメソッドを呼び出す必要がありますが、パラメーターは異なります。
たとえば、1 つのボタンをタップmyMethod:
して引数@"foo"
でメソッドを呼び出し、2 番目のボタンで同じメソッドを引数で呼び出す必要があります@"bar"
。
私の iPhone アプリには多くのボタンがあり、すべてのボタンで同じメソッドを呼び出す必要がありますが、パラメーターは異なります。
たとえば、1 つのボタンをタップmyMethod:
して引数@"foo"
でメソッドを呼び出し、2 番目のボタンで同じメソッドを引数で呼び出す必要があります@"bar"
。
いわゆる「IBActions」には、次の署名のいずれかが必要です。
-(void)action;
-(void)actionWithSender:(id)sender;
-(void)actionWithSender:(id)sender event:(UIEvent*)event;
他のパラメータを追加することはできません。それにもかかわらずsender
、パラメータを取得するために(あなたの場合はbutton1またはbutton2)を使用できます:
-(void)actionWithSender:(UIButton*)sender {
NSString* parameter;
if (sender.tag == 1) // button1
parameter = @"foo";
else // button2
parameter = @"bar";
...
}
パラメータを追加できない本当の理由は、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 は static のままにしておくか、malloc を使用して割り当てる必要があります (ますます醜いコードが増えています...)。ローカル変数は使用しないでください。スタックに割り当てられるため、setup メソッドを終了した後に削除されます。
さまざまなUIButton
インスタンスに異なるtag
プロパティ値を与えます。
あなたのIBAction
メソッド-myMethod:
では、次のようなことをするかもしれません:
- (void) myMethod:(id)sender {
switch (sender.tag) {
case (firstButtonTag):
doFooStuff;
break;
case (secondButtonTag):
doBarStuff;
break;
// etc.
}
}
これを簡単に維持したい場合は、値firstButtonTag
をsecondButtonTag
に格納できます。enum
IBAction を介してパラメーターを渡すことはできません。私が通常行うことは、IB でボタンに一意のタグを付けることです。タグは整数値なので、単純なルックアップ テーブルを使用してタグを何らかの値に変換します。
この場合、ボタンは 3 つですが、タグは 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]);
}
}
(id)Sender は、UIButton クリック イベントで渡したものはすべてこのメソッドに直接渡され、それがどのようなタイプであっても、ボタン タグを渡すと自動的に取得され、ボタン タグが sender.tag などとして取得されることを示しています。
他の人が述べたように、カスタム パラメータをアクション メソッドに渡すことはできません。タグを使用したソリューションが気に入らない場合は、カスタム クラスで UIButton をサブクラス化し、そこにパラメーターを追加することもできます。(気にせず、タグを使用するだけです)
あなたはそうしない。唯一のパラメーターは送信者オブジェクトで、これを使用して別の動作を行うことができますが、私が行うのは 2 つのアクション メソッドを定義することです。これらのメソッドは、同じメソッドを別のパラメーターで呼び出すだけです。つまり、次のようになります。
- (IBAction)button1:(id)sender
{
[self doStuff:kButton1];
}
- (IBAction)button2:(id)sender
{
[self doStuff:kButton2];
}
- (void)doStuff:(ParamType)param;
{
...
}
そのメソッドを擁護するために (しゃれた意図はありません)、Interface Builder で UI を確認して、異なるボタンが実際には異なる効果を持っていることを確認すると、より明確になると付け加えておきます。