2009-05-25 11 views
6

私のUIViewサブクラスのイベントを登録する最良の方法は、インタフェースビルダーのIBAction-sに接続できるようにすることです。カスタムUIViewのイベント

現在、標準のUIViewがメインビューにドロップされています。クラスを「ラジオダイヤル」(私のカスタムクラス)に設定しました。これは、表示をうまく表示しますが、私はそれからイベントを取得する方法がわかりません。

おかげ

答えて

5

次のことを明確にしてください:Interface Builderは、View Controllerがあなたのビューサブクラスが発光するカスタムイベントを配線するようにしたいと思っていますか?

このタイプの機能が必要な場合は、ビューとプロトコルを組み合わせた一般的な「代理人」プロパティを使用する必要があります。

@protocol RadioDialDelegate 
-(void)dialValueChanged:(id)sender 
@end 

@interface RadioDial 
{ 
    id<RadioDialDelegate> radioDelegate; 
} 
@property (nonatomic, assign) IBOutlet id<RadioDialDelegate> radioDelegate; 

これにより、コントローラは、(それがRadioDialDelegateを実装すると仮定して)ビューまでの配線とビューから出てくるイベントを受信することを可能にします。代わりに、型なしのデリゲートを使用して、ビューコードで遅延バインドコールを使用することもできます。

if([radioDelegate respondsToSelector:@selector(dialValueChanged:)]) { 
    [radioDelegate dialValueChanged:self]; 
} 
+0

はい、まさにその意味です。そして、私が抱えている問題は、私のビューのサブクラスのカスタムイベントを作成することです。実際に起こっているのは、クラス内で - 特定の条件の下で(空の)接触があったため、私は発砲したいと思います。そのイベントをIBを通じてIBActionsに接続できるようにしたいと思います。 –

+0

私はこれを行う方法を反映するために私の答えを編集しました。これを行うには、デリゲート/プロトコルパターンを利用する必要があります。 IBは、コントローラに割り当てられたプロパティとしてデリゲートを公開します(IBでコントローラクラスを適切に設定する必要があります)。コントローラはプロトコルを実装する必要があります。 – Jason

+0

そのようなことは意味があります(Objective-C/Cocoaの全体にはかなり新しくなりました)。しかし、これにより、どのようにして各RadioDialの値変更イベントをView Controller上の別のメソッドに配線することができますか? 私は同じ方法を使用し、送信者参照をチェックすることができると私は理解しますが、それは唯一の方法ですか? –

3

は(何もないならば、あなたはあなたのプロジェクトでRootViewControllerを持つべきである)あなたのビューコントローラにメソッドを作成します。あなたは、その後に置くのは、あなたの方法は、(例えばRootViewController.h)コントローラのヘッダファイルで

-(void) buttonClicked { code code code } 

あるとしましょう:

-(IBAction) buttonClicked; 

そしてIBで、あなたのボタン/ラジオダイヤルを右クリック/何でも。イベントのリストが表示され、コントローラーが受け取るイベントのコネクターから、コントローラーを表すIBのオブジェクト(おそらく最初のレスポンダー)にドラッグできます。これはあなたのIB構造がどのように設定されているかによって異なりますが、それは簡単です。

もう1つの方法は、プログラム的にUIViewを作成する方法を学び、当面IBを忘れることです。最初にIBの使用を学ぶ方が良いかどうか、またはコードですべてを行い、後でIBを保存する方が良いかどうかについて意見が分かれています。どんな場合でも、ある時点でインターフェースを設定する両方の方法を学ぶ必要があります。

関連する問題