2009-05-07 9 views
7

私はココアを使用して別のオブジェクトにアクションを送信したいと思います。理想的には、Interface Builderに表示することも理想的です。アクションを送信ココア - IBAction

アップルのドキュメントを試しましたが、欠落しているものがあります。以下を追加すると、インターフェースビルディングはアクションを受信したものとしてのみ表示します。

送信者アクションの作成方法の例を教えてください。ありがとう


私は自分のコントローラ1で定義された受信アクションを持っています。私は私のcontroller2が(NSButtonのように)コントローラ1にアクションを送ることができるようにしたい。インターフェイスビルドでは、シグナルを受け取るコントロールにFRB NSButtonという行をドラッグできます。この機能は、そこにリンゴオブジェクトに限定することはできません、それを行う方法でなければなりません。

答えて

1

コントローラ1とコントローラ2は、NSControlのサブクラスです。

[controller2 sendAction:@selector(receiveAction:) to:controller1]; 
0

アクションは常にオブジェクトによって受信されます。他の方向に情報を送信したい場合は、アウトレットが必要です。IBOutletを探します。

+0

NSSegmentedcontrol sendトグル:それでは? –

+0

NSSegmentedControlは、そのメッセージを受け入れるオブジェクトに対してのみ 'toggle:'を送ることができます。 aroneousは正しい:アクションは、送信者によってではなく、受信者によって宣言される。 –

+0

はい私はコントローラ1で定義された受信アクションを持っています。私は私のcontroller2が(NSButtonのように)コントローラ1にアクションを送ることができるようにしたい。インターフェイスビルドでは、シグナルを受け取るコントロールにFRB NSButtonという行をドラッグできます。この機能は、そこにリンゴオブジェクトに限定することはできません、それを行う方法でなければなりません。 –

1

NSButtonはNSControlなので、あなたが結びつけることができる「アクション」があります。コントロールをトリガしたときに送信されるメッセージ(ボタンをクリックするなど)です。コントローラーにはアクションがありません(何を意味するのでしょう - どのようにメッセージを送信させますか?)、あなたがしようとしていることは実際には意味がありません。

コントローラ2が何かを行うことができるようにするには、controller2(コンセント1のタイプまたはそれが実装するインタフェース)のコンセントを作成し、IBのcontroller1に接続してから、プログラマチックにコントローラー2からコントローラー1にします。

1

Controller2クラスがNSControlのサブクラスである場合は、これを行う必要があります。 NSControlはInterface BuilderでNSButtonからドラッグしたときにターゲットオブジェクトに接続している「送信アクション」を定義します。つまり、IB 3.0にはバグがあり、送信されたアクションがIBに現れないようになっています。詳細は、this cocoa-dev threadを参照してください。

17

IBAction Interface Builderを告げるプリプロセッサディレクティブで「これはあなたが知っておくべきものですが。」実際にはvoidと評価されます。あなたがNSButtonから得ることができる動作を模倣したい場合は、あなたがのためにコンセントを追加することができます

[target someMethod:self]; 

:その意味は、「アクション」は、あなたが通常の方法で呼び出すことができるだけで、通常の方法であることは何ですターゲットと(文字列として)セレクタのプロパティ:

@property (nonatomic, retain) IBOutlet id target; 
@property (nonatomic, retain) NSString* actionSelectorString; 

あなたは、このように呼び出すことができます。

SEL action = NSSelectorFromString(self.actionSelectorString); 
[self.target performSelector:action withObject:self]; 

は、あなたがしたい場合を経由してセレクタを配線するためにあなたのクラスInterface Builderでドラッグアンドドロップするのが最も簡単な方法は、クラスをNSControlのサブクラスにすることです(カスタムビューをオブジェクトライブラリからドラッグし、インスペクタを表示するにはCommand-6を押し、上部のポップアップでクラスを選択します)。次のようにアクションを「呼び出す」ことができます。

- (void) go { 
    [self sendAction:self.action to:self.target]; 
} 
+1

インタフェースビルダーは、究極のPotemkin村です。それとももっと似ていますか?ステップフォードの妻。彼女はあなたがそこで起こっている物語を見せないようにとても頑張ります...そして、彼女は怖い、猿のパッチを当てたCアセンブリなどで満たされた燃え尽きた町だと思います。 –

+3

他のドラッグやあなたが触れなければならない大量のコードを生成する、より多くの嫌悪感を隠す傾向のあるインターフェース構築ツール。 IBはObjCの動的実行時に役立ちますが、魔法ではありません。上記の説明の半分(プロパティの残りの半分はプロパティを設定しています)、それはまったく時間がかかりませんでしたか? – TALlama

+1

私は愚かなことをしています...あなたは正しいのです... Xcodeで生成されたアセンブリでさえ、かなり読みやすく優雅です。 ( 'Product - > Generate Output - > Assembly File')。しかし、アップルは、時代遅れのものか、まったく技術的でないものの存在の無知を否定/偽りの間で、外部から少なくとも面白い/厄介な行を踊っている。彼らはあなたが知りたくないランタイム機能だけを軽く文書化するだけです。それはすべての合理的で非公式です。しかし、特にいくつかは意図的に禁止されている果物であるため、議論して学ぶ楽しさの複雑さがほとんどありません。 –

関連する問題