2

ほとんどのアクションでは、InterfaceBuilder をクリックしてドラッグするだけで、インターフェイス オブジェクトからコードへの呼び出しを「接続」できます。たとえば、ユーザーがテーブルの行をシングルクリックしたときを知りたい場合は、接続をテーブルのアクションからコントローラーのアクションにドラッグします。

しかしここで、ユーザーが行をダブルクリックすることを考えてみましょう。これが発生したときにアクションの 1 つを呼び出すには、 だけで-[NSTableView setDoubleAction]なく -[NSControl setTarget]呼び出す必要があります。なんで?

明確にするために、Interface Builder がサポートしない理由を尋ねているわけではありませsetDoubleAction。すべてのツールには制限があります。setTarget私は、仕事をしたくない限り、また仕事をするまで、どのように、そしてなぜそれが必要ではないように思われるかについて、より深く理解しようとしていsetDoubleActionます. この質問の別の言い方は、次のようになります: テーブルの (シングルクリック) アクションのターゲットを設定するために、Interface Builder で何もする必要がないのはなぜですか?

4

2 に答える 2

1

テーブル ビューを IB のアクションに接続して呼び出しsetDoubleActionた場合、 を追加で呼び出す必要はありませんsetTarget。ただし、ダブルクリック メッセージのみを受け取りたい場合で、テーブル ビューを IB のアクションに接続していない場合は、を呼び出す必要setTargetあります。

テーブル ビューはactiondoubleActionを同じターゲットに送信します。NSTableView が次のように実装されていると想像できます。

@implementation NSTableView

- (void)theUserClickedOnMe
{
   [self sendAction:[self action] to:[self target];
}

- (void)theUserDoubleClickedOnMe
{
   [self sendAction:[self doubleAction] to:[self target]];
}

@end

IB で行っていることは、次のようなものです。

- (void)userConnectedControl:(NSControl *)control
        toAction:(SEL)action
        ofObject:(id)object
{
   [control setTarget:object];
   [control setAction:action];
}

実際の実装はそこまではいきませんが、事実上そうなっています。

于 2010-03-27T02:44:24.833 に答える
1

アクション (またはダブルクリック アクション) を設定し、ターゲットを設定しない (またはターゲットを に設定するnil) 場合、アクション メッセージはレスポンダー チェーンを通過します。

アクションに加えてターゲットを設定すると、アクション メッセージはそのオブジェクトにのみ送信されます。

于 2010-03-27T03:23:28.450 に答える