2016-11-28 4 views
0

私は基本的にNSViewサブクラスのカスタムボタンを作成しました。ボタンはmouseDown()で反応し、セレクタ/アクションを実行する必要があります。カスタムクラスのセレクタ

ターゲット変数とアクション変数をサブクラスに追加する方法はわかりません(NSButtonなどのユーザーインターフェイス要素に似ています)。試しました

var target : AnyObject? 
var action: Selector? 

また、私のサブクラスでターゲットを使ってセレクタを実行するにはどうすればよいですか?

+2

この質問は非常に幅広く、あなたが解決しようとしている問題には間違った解決策となる可能性があります。独自のボタンをロールしなければならない場合は、 'NSControl'をサブクラス化するほうが良いでしょう。しかし、NSButtonを適切に設定する方が良いでしょう。 – par

+0

@parこの質問については、何も広い意味はありません。 OPにはカスタムクラスのターゲットプロパティとアクションプロパティがあります。問題は、ターゲット上でアクションを呼び出す方法を尋ねることです。 – rmaddy

+0

@rmaddyですが、あなたの質問には答えはありませんが、OPの質問に答えます。 Vincentは 'IBOutlet'sを使ったソリューションを提案しています。あなたはクロージャーと全く異なるアーキテクチャアプローチを推奨します。これらの種類の広範な回答は、幅広い質問の直接の結果です。 – par

答えて

5

「ターゲット/アクション」のペアは古いものであり、避けてください。しかし、実際に使用したい場合は、NSApplication sendAction(_:to:from:)メソッドを見てください。

カスタムボタンがNSControlの場合は、そのtargetと,のプロパティとそのsendAction(_:to:)メソッドを使用できます。

最近のアプローチでは、ボタンクラスのクロージャープロパティを用意し、ターゲット/アクションペアを使用する代わりにそのクロージャーを呼び出すことがあります。クロージャを使用すると、より安全でクリーンなので、おそらくボタンクラスのクライアントコードを書くのが簡単になります。

+0

あなたはターゲット/アクションが古くからあると思いますか?このパターンは、iOS/OS Xのほぼすべてのコントロールを支えており、ターゲット/アクションは基本的にバリアントですが、多くの目的で依然として非常に関連性の高いAPIです。クロージャーは確かにその場所を持っていますが、自分の欠点があります(ほとんどの人は ''弱い自己 ''をいつ使うかについて非常に混乱しているように見えます)。あなたの答えは、明白な裏付けの証拠や動機がなく、「最新のもの」に賛成して真実の原則を放棄することを主張するようです。 – par

+1

@parターゲット/アクションには型の安全性はありません。アクションへの任意のパラメータをサポートする簡単な方法はありません。 Cocoaのターゲット/アクションは、ブロックが存在する前にObjective-Cで作成されていたことに留意してください。それは当時の唯一のアプローチでした。クロージャー/ブロックははるかに柔軟性とタイプを安全に提供します。ほとんどの場合、それははるかにクリーンです。 – rmaddy

+1

@parセレクタを間違って使用する問題のため、スタックオーバーフローに関する膨大な数の「認識できないセレクタ」の質問を見てください。 – rmaddy

関連する問題