何时用@selector使用冒号

刚开始使用iPhone开发和Objective-C。

昨天我试图在我的视图中添加Observer来发送通知,但我一直在收到这个错误:

 无法识别的select器发送到实例 

我追踪到,我需要将尾部冒号包含在我的select器参数中:

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

今天,我觉得我很聪明,因为当设置一个button的动作参数时,我记得昨天我的错误,并将冒号添加到动作参数中。 动作参数需要一个@selector,就像设置一个NSNotification的观察者时的select器参数一样,所以我想我正在做正确的事情。

但是,用下面的代码:

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

我得到完全相同的错误:

 无法识别的select器发送到实例 

是什么赋予了? 为什么一个@select器需要一个尾部冒号,而另一个不是? 我应该遵循什么规则,什么时候应该包括什么,什么时候应该被closures,为什么我不能总是只做一个或另一个?

谢谢!

正如boltClock所提到的,你所指的字符实际上是一个冒号。 @selector(method)@selector(method:)之间的区别是方法签名。 第二个变体需要传递一个参数。

@selector(method)会期望方法: -(void)method

@selector(method:)会期望的方法: -(void)method:(id)someParameter

您似乎在这里错过了一个概念:冒号在某种程度上是方法名称的一部分。 例如,方法

 -(IBAction) doIt:(id)sender; 

有名字。 所以应该用冒号来引用这个方法。
但是这个方法最后没有冒号

 -(IBAction) doItWithoutParameter; 

接受多个参数的方法也一样,它们的名字如doItWithParam1:andParam2:

select器表示方法名称,select器中的冒号数目与相应方法中的参数数目匹配:

  1. mySelector – 不冒号,没有参数,例如- (void)mySelector;[self mySelector];
  2. mySelectorWithFoo: – 一个冒号,一个参数,例如- (void)mySelectorWithFoo:(Foo *)foo;[self mySelectorWithFoo:someFoo];
  3. mySelectorWithFoo:withBar: – 两个冒号,两个参数,例如- (void)mySelectorWithFoo:(Foo *)foo bar:(Bar *)bar;[self mySelectorWithFoo:someFoo bar:someBar];

等等。

没有“命名”参数也可以有一个select器。 这是不推荐的,因为它不是立即清楚什么参数:

  1. mySelector:: – 两个冒号,两个参数,例如- (void)mySelector:(Foo *)foo :(Bar *)bar;[self mySelector:someFoo :someBar];
  2. mySelector::: – 三个冒号,三个参数,例如- (void)mySelector:(int)x :(int)y :(int)z;[self mySelector:2 :3 :5];

冒号表示该方法带有一个参数。

[someObject performSelector:@selector(doSomething:)]意味着doSomething需要一个参数。

[someObject performSelector:@selector(doSomething)]意味着doSomething不需要任何参数。

在你的情况下:

 [[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 */ } 

我认为问题是缺less的参数。

看到这篇文章: Objective-C:调用具有多个参数的select器 (很好的答案!)