何时用@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器中的冒号数目与相应方法中的参数数目匹配:
-
mySelector
– 不冒号,没有参数,例如- (void)mySelector;
,[self mySelector];
-
mySelectorWithFoo:
– 一个冒号,一个参数,例如- (void)mySelectorWithFoo:(Foo *)foo;
,[self mySelectorWithFoo:someFoo];
-
mySelectorWithFoo:withBar:
– 两个冒号,两个参数,例如- (void)mySelectorWithFoo:(Foo *)foo bar:(Bar *)bar;
,[self mySelectorWithFoo:someFoo bar:someBar];
等等。
没有“命名”参数也可以有一个select器。 这是不推荐的,因为它不是立即清楚什么参数:
-
mySelector::
– 两个冒号,两个参数,例如- (void)mySelector:(Foo *)foo :(Bar *)bar;
,[self mySelector:someFoo :someBar];
-
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器 (很好的答案!)