IBAction
UI要素のアクションに接続する予定のアクションをInterface Builderが見つけられるようにするための単なるタグです。実際、これは の同義語ですvoid
。
#IBAction void の定義
さらに、2 つの異なるメソッド シグネチャがあります。議論をする人もいれば、しない人もいます。引数を取るメソッドでは、アクションをトリガーした UI 要素へのポインターになります。最も可能性が高いsender
と定義したものです。IBOutlet
UI インタラクション (タッチなど) の結果として呼び出されるメソッドがある場合、メソッド シグネチャは送信者引数を許可する必要があります。
引数のないメソッド シグネチャは、アクションをトリガーするオブジェクトを必ずしもメソッド呼び出しに含める必要がない場合に役立ちます。ただし、一貫性を保つ必要があります。メソッドが引数を期待する場合、SDK が引数を送信することを認識していることを確認する必要があります。これは、セレクターの名前にコロン (:) を含めたり除外したりするのと同じくらい簡単です。Gesture Recognizer が良い例です。次のように、ジェスチャ認識エンジンのアクションを定義できます。
-(void)handleTap
{
...
}
次に、このメソッドを使用するようにジェスチャ認識エンジンをセットアップします。
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap)];
にコロンがないことに注意してください@selector(handleTap)
。一方、次のようにメソッドを定義した場合:
-(void)handleTap:(UITapGestureRegognizer *)tap
{
...
}
次のようにジェスチャ認識エンジンを作成する必要があります。
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
違いを見ます?そうすることで、ジェスチャ レコグナイザーがメソッドを呼び出すと、それ自体が引数としてメソッドに渡されます。
正直なところ、このニュアンスがセレクターを指定できるすべての場所に当てはまるかどうかはわかりません。コンテキスト固有だと思います。たとえば、NSTimer のセレクターは、その引数で NSTimer オブジェクトへのポインターを受け入れることができなければなりません。ドキュメントは通常、ケースバイケースでこれについて明確にしています。