0

UIButtonを押すことと、

  -(IBAction) action:(id)sender     Method1
  {
    do something....
   }

プログラムで呼び出すのとは対照的にMethod2

  -(void) action
   {
    do something....
   }

アクションがそのように呼び出されたとき、Method1は正しいです。Method2は、異なる間違った効果を示しました。

両方のルーチンの中で、何かをすることはまったく同じです。

なぜそのような違い?プログラムでIBActionを模倣するために何ができますか?

4

1 に答える 1

2

IBActionUI要素のアクションに接続する予定のアクションを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 オブジェクトへのポインターを受け入れることができなければなりません。ドキュメントは通常、ケースバイケースでこれについて明確にしています。

于 2012-08-21T19:31:28.687 に答える