4

setAction Arguments を使用して NSButton を追加したいだけです。

NSRect frame = NSMakeRect(10, 40, 90, 40);  
NSButton* pushButton = [[NSButton alloc] initWithFrame: frame];  
[pushButton setTarget:self];   
[pushButton setAction:@selector(myAction:)];

しかし、関数 myAction に引数を入れたいのですが...
どのように?
ありがとう。

4

4 に答える 4

5

しかし、関数 myAction に引数を入れたいのですが...
どのように?

できません。

…このメソッドを使用するボタンが複数ある場合、送信者を区別することはできません (タイトルのみ)…

どのボタン (または他のコントロール) が話しかけているかを確認するには、次の 3 つの方法があります。

  • 各ボタン (または他のコントロール) にタグを割り当て、アクション メソッドでタグを比較します。nib でコントロールを作成する場合、タグを 2 回 (コードで 1 回、nib で 1 回) 記述する必要があるという欠点があります。ボタンをゼロから手で書き出すので、その問題はありません。
  • このメッセージを送信すると予想されるすべてのコントロールへのアウトレットsenderを用意し、各アウトレットと比較します。
  • 各コントロールが各アクションに接続されている唯一のコントロールで、さまざまなアクション メソッドを用意します。各アクション メソッドは、どのコントロールがそのメッセージを送信したかを特定する必要はありません。

タグの問題は、前述の反復性です。また、各タグに名前を付けるのを忘れがちなので、if ([sender tag] == 42)どのコントロールが #42 であるかを知らずに、または調べる必要がないようなコードを見てしまうことになります。

アウトレットの問題は、アクション メソッドが非常に長くなる可能性があることです。いずれにせよ、おそらく、同じメソッドでビジネスを行わない複数の異なることを実行している可能性があります。(これはタグの問題でもあります。)

したがって、私は通常、3 番目のソリューションを好みます。ユーザーをターゲットとするすべてのボタン (またはその他のコントロール) のアクション メソッドを作成します。通常、メソッドとボタンに同じ名前 ( save:「保存」など) または非常に似た名前 ( terminate:「Quit」など) を付けるので、各メソッドを読むだけで、それがどのボタンに属しているかがわかります。

于 2012-12-31T20:27:45.370 に答える
1

プログラムで NSButton を作成したことはありませんが、次のようなメソッドを作成するだけでよいと思います。

- (void) myAction: (NSButton*)button{
    //your code
}

以上です !!

于 2012-12-31T17:30:38.107 に答える
1

関連付けられたオブジェクトを使用して引数を渡すことができます。

参照できます: http://labs.vectorform.com/2011/07/objective-c-associated-objects/

http://www.cocoanetics.com/2012/06/associated-objects/

于 2012-12-31T18:23:17.863 に答える