12

iPhoneの開発を始めたばかりObjective-Cです。

昨日、自分の視点で通知のためにObserverを追加しようとしましたが、次のエラーが発生し続けました。

認識されないセレクターがインスタンスに送信されました

セレクター引数に末尾のコロンを含める必要があるという事実まで追跡しました。

[[NSNotificationCenter defaultCenter] addObserver:selfセレクター:@selector(nameOfMySelector :) name:@ "BBLocationServicesAreDisabled" object:nil];

今日は、ボタンにアクション引数を設定するときに、昨日の間違いを思い出し、アクション引数にコロンを追加したので、賢いと思いました。@selectorのオブザーバーを設定するときのセレクター引数と同じように、アクション引数はを取りますNSNotification。そのため、私は正しいことをしていると思いました。

ただし、次のコードを使用します。

[self.callToActionButton addTarget:self action:@selector(nameOfMySelector :) forControlEvents:UIControlEventTouchUpInside];

まったく同じエラーが発生します:

認識されないセレクターがインスタンスに送信されました

何が得られますか?なぜ一方@selectorは末尾のコロンを必要とし、もう一方は必要としないのですか?含める必要がある場合と除外する必要がある場合のルールは何ですか。また、常にどちらか一方を実行できないのはなぜですか。

ありがとう!

4

6 に答える 6

30

BoltClockが述べているように、参照している文字は実際にはコロンです。@selector(method)との違い@selector(method:)はメソッドシグネチャです。2番目のバリアントは、パラメーターが渡されることを想定しています。

@selector(method)メソッドを期待します: -(void)method

@selector(method:)メソッドを期待します: -(void)method:(id)someParameter

于 2011-02-10T05:18:40.183 に答える
8

ここで1つの概念が欠落しているようです。コロンは、ある意味でメソッド名の一部です。例:メソッド

-(IBAction) doIt:(id)sender;

名前がありdoIt:ます。したがって、このメソッドを参照するにはコロンを使用する必要があります。
ただし、このメソッドの最後にはコロンがありません

-(IBAction) doItWithoutParameter;

複数の引数を受け入れるメソッドについても同じことが言えます。名前は次のようになります。doItWithParam1:andParam2:

于 2011-02-10T05:17:49.580 に答える
7

セレクターはメソッド名を表し、セレクターのコロンの数は、対応するメソッドの引数の数と一致します。

  1. mySelector—コロンなし、引数なし、例- (void)mySelector;[self mySelector];
  2. mySelectorWithFoo:— 1つのコロン、1つの引数、たとえば- (void)mySelectorWithFoo:(Foo *)foo;[self mySelectorWithFoo:someFoo];
  3. mySelectorWithFoo:withBar:— 2つのコロン、2つの引数、たとえば- (void)mySelectorWithFoo:(Foo *)foo bar:(Bar *)bar;[self mySelectorWithFoo:someFoo bar:someBar];

などなど。

パラメータに「名前を付ける」ことなくセレクターを使用することもできます。パラメータがすぐにはわからないため、お勧めしません。

  1. mySelector::— 2つのコロン、2つの引数、たとえば- (void)mySelector:(Foo *)foo :(Bar *)bar;[self mySelector:someFoo :someBar];
  2. mySelector:::— 3つのコロン、3つの引数、たとえば- (void)mySelector:(int)x :(int)y :(int)z;[self mySelector:2 :3 :5];
于 2011-02-10T05:30:15.833 に答える
2

コロンは、メソッドがパラメーターを受け取ることを示します。

[someObject performSelector:@selector(doSomething:)]doSomethingがパラメーターを予期していることを意味します。

[someObject performSelector:@selector(doSomething)]doSomethingはパラメータを必要としないことを意味します。

于 2011-02-10T05:19:09.840 に答える
2

あなたの場合:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(nameOfMySelector:) name:@"BBLocationServicesAreDisabled" object:nil];

- (void) nameOfMySelector: (NSNotification *) notification {
    /* this method would require the semi-colon */
}

またはこの場合:

[self.callToActionButton addTarget:self action:@selector(nameOfMySelector:) forControlEvents:UIControlEventTouchUpInside];

- (void) nameOfMySelector: (id) sender {
    /* this method would also require the semi-colon */
}
于 2011-02-10T05:19:42.247 に答える
0

問題はパラメータがないことだと思います。

この投稿を参照してください:Objective-C:複数の引数を使用してセレクターを呼び出す(すばらしい答えです!)

于 2011-02-10T05:27:53.187 に答える