2011-05-13 23 views
3
私はアクションに関する例を通過しながら、私はしばしばのようなものを見たiPhone開発のためのObjective-Cについて学ぶしようとしています

なぜ代わりに(UIButton *)の(ID)、送信者、送信者

- (IBAction)sliderMoved:(id)sender 
{ 
    UISlider *aSlider = (UISlider *)sender; 
    //rest of code goes here... 
} 

は何ですかタイプ(id)を取り込み、すぐにそれを(UISlider *)にキャストする目的。

- (IBAction)sliderMoved:(UISlider *)aSlider; 
{ 
    //rest of code goes here... 
} 

このための技術的な理由がある、またはそれは単に慣例である、または読みやすさのために行わ:なぜ、ちょうど次は持っていませんか?事前に

おかげで、

  • ティモ

答えて

6

私は、UIControlとIBActionのマッピングが必ずしも1:1であるとは限りません。たとえば、UISwitch、UIButton、およびUITextFieldをすべて- (IBAction)syncUI:(id)sender;メソッドにマップすることができます。その場合、型を指定することは不可能です。

私はこれが私の精神的な正当な理由であると認めますが、送信者の種類を明確にすることはできません。私は通常です。

0

idは、抽象データ型です。メソッドを複数の場所、別のオブジェクト、ボタンなどから呼び出すことができる場合は、メソッド呼び出しを送信しているオブジェクトのタイプが常にわからないことがあります。私はそれが主に慣習であると思っています。送信者にデータをポーリングする場合、どのメソッドが応答できるかを知っておく必要があります(respondsToSelectorで質問できない場合:)。

2

IBActionsは通常汎用であり、どのクラスでも起動できるため、idタイプです。メソッド内にsender変数をキャストする必要がある場合は、明らかにクラスsenderを気にするので、メソッドのシグネチャを変更して反映させる必要があります。

3

送信者には、実際にはUIButton*と指定することができます。また、他の種類のオブジェクトによってその操作が引き起こされることが絶対に確実である場合は、そのアクションが送信者が特定のタイプであるかどうかによって決まる場合でも、それは適切かもしれません。ただし、通常、送信者のタイプはコントローラには関係ありません。idと指定すると、コントローラを変更しなくてもビューを自由に変更できます。

このような柔軟性が必要な理由の1つは、問題のアクションで常にアプリケーション内のボタンを使用することがわかっていても、単体テストをはるかに簡単に行うことができるということです。

関連する問題