しかし、関数 myAction に引数を入れたいのですが...
どのように?
できません。
…このメソッドを使用するボタンが複数ある場合、送信者を区別することはできません (タイトルのみ)…
どのボタン (または他のコントロール) が話しかけているかを確認するには、次の 3 つの方法があります。
- 各ボタン (または他のコントロール) にタグを割り当て、アクション メソッドでタグを比較します。nib でコントロールを作成する場合、タグを 2 回 (コードで 1 回、nib で 1 回) 記述する必要があるという欠点があります。ボタンをゼロから手で書き出すので、その問題はありません。
- このメッセージを送信すると予想されるすべてのコントロールへのアウトレット
sender
を用意し、各アウトレットと比較します。
- 各コントロールが各アクションに接続されている唯一のコントロールで、さまざまなアクション メソッドを用意します。各アクション メソッドは、どのコントロールがそのメッセージを送信したかを特定する必要はありません。
タグの問題は、前述の反復性です。また、各タグに名前を付けるのを忘れがちなので、if ([sender tag] == 42)
どのコントロールが #42 であるかを知らずに、または調べる必要がないようなコードを見てしまうことになります。
アウトレットの問題は、アクション メソッドが非常に長くなる可能性があることです。いずれにせよ、おそらく、同じメソッドでビジネスを行わない複数の異なることを実行している可能性があります。(これはタグの問題でもあります。)
したがって、私は通常、3 番目のソリューションを好みます。ユーザーをターゲットとするすべてのボタン (またはその他のコントロール) のアクション メソッドを作成します。通常、メソッドとボタンに同じ名前 ( save:
「保存」など) または非常に似た名前 ( terminate:
「Quit」など) を付けるので、各メソッドを読むだけで、それがどのボタンに属しているかがわかります。