2011-01-03 18 views
0

CoreDateBooksとレシピサンプルをスタイルガイドとして使用していますが、他の多くのサンプルや書籍も見ています。誰かが@selectorステートメントを正しく書く方法を説明するのに役立つことができますか?私はいくつかの異なるスタイルを見る。xcode構文に関する質問@selector

CoreDataBooksから、追加ボタンセレクタはコロンを含まない単一の用語であり、メソッドはIBActionであり、インタフェースで宣言されています。レシピから

UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addBook)]; 
... 
- (IBAction)addBook { 
} 

、追加ボタンの選択は、結腸、方法の使用(ボイド)および(ID)、送信者が続く用語であり、それはインタフェース内で宣言されていません。

UIBarButtonItem *addButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(add:)]; 
... 
- (void)add:(id)sender { 

[キャンセル]ボタンの後にもう1つの構文があります。ボタンセレクタの後にはコロンのない用語が続き、メソッドは送信者ではなくvoidを使用しますが、インターフェイスでは宣言されません。

UIBarButtonItem *cancelButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStyleBordered target:self action:@selector(cancel)]; 
... 
- (void)cancel { 

私は追加と追加が異なることを理解していますが、2番目のパラメータにはパラメータが必要ですが、どちらか一方の理由がありますか?そして、いつインタフェースのメソッド名を配置する必要がありますか?

つまり、セレクタ(@selector(add)や@selector(cancel)など)を宣言すると、単純に - (void)形式を使用できますか?

答えて

4

IBActionは、voidにtypedefされます。その唯一の機能は、インターフェイスがnibファイルにある場合、Interface Builderがアクションにインターフェイス要素をマップできるようにすることです。それはあなたのインターフェースファイルでのみ宣言されているので、Interface Builderはそれを見ることができます。したがって、- (IBAction)myAction- (void)myActionの間には実際の違いはありません。

アクションメソッドがアクションをトリガーしたコントロール/ビュー(つまり、アクションがターゲットで呼び出されたときに常に同じことをする)を知る必要がない場合は、(id)senderパラメーターを省略し、セレクターを渡すことができます結腸なし。

Interface Builderを使用していない場合は、IBAction形式を使用する必要はなく、メソッドが同じクラス内でのみ呼び出される場合は、ヘッダーファイルにそのメソッドを公開する必要はありませんそうすることでどんな害も)。

+0

ありがとうございました。これは非常に明確です。 – jon

0

他のクラス(またはInterface Builder)で使用するには、セレクタをインターフェイスに配置する必要があります。それ以外の場合は、セレクタが.mファイルで定義されていることを確認してから使用してください。

+0

... @BoltClockが言ったことに加えて意図されています。 –

+0

プロンプトの応答を気に入ってください。 – jon

0

1)ほとんどのデリゲートコールバックメソッドでは、パラメータ受け入れコールバックを指定すると、パラメータは送信元コントロールの「送信者」になります。同じデリゲートメソッドを使用して複数のコントロールのコールバックを処理する場合は、このパラメーターが必要になる場合があります。または、コールバック内のソースコントロールの変更に影響を与え、それ以外の場合はポインタを格納していない場合。

2)インターフェイス定義にコールバック定義を含める必要があるのは、Interface Builderを使用してコールバックを接続する必要がある場合だけです。実装自体を忘れてしまった場合、コールバックデリゲートメソッドを使用するほとんどのコントロールがメソッドが存在するかどうかを最初に確認しないので、コールバックはアプリケーションをクラッシュさせる可能性があります。

+0

現時点では代議員はいません。これを簡単に保つことを試みている。 – jon