在我找到的所有教程或示例中,它们在选择器名称(getCurrentData:
)后面显示一个冒号,如下所示:
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(getCurrentData:)
name:@"mapsReceived"
object:nil ];
由于示例中此冒号之后没有任何内容,我假设指定的方法不带任何参数。而我的也不是,但是当我使用上面的语法时,我的应用程序崩溃并说unrecognized selector sent to instance
我删除冒号,它可以工作。那么为什么所有例子都显示冒号?
其次,如果我 使用需要参数的选择器,我该怎么做?如果我这样做:
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(createButtons:@"ten grand";)
name:@"mapsReceived"
object:nil ];
它甚至不会编译;在删除文本字符串和冒号之前,我遇到了大量错误。然而,我可以使用字符串调用此方法,在NSNotification之外使用它时就可以了。有没有办法在这里做我想要的?
答案 0 :(得分:3)
首先,大多数示例都假设您将通知传递给方法。例如:
- (void)respondToNotification:(NSNotification *);
这将表示为:
@selector(respondToNotification:)
如果你删除了这个参数,那就是
@selector(respondToNotification)
对于第二项,您不能以这种方式指定参数。您需要以接收通知作为参数的方式构建方法,然后您可以检查通知并调用另一种方法来执行您需要的任何操作。
答案 1 :(得分:2)
当NSNotificationCenter
发送通知时(通过您指定的选择器 - 例如getCurrentData:
),它将传递NSNotification
的实例,因此您的方法必须接受一个参数,即这样的例子。
答案 2 :(得分:2)
第一个问题的答案是在Objective C中,冒号是函数名的一部分。如果省略它,则引用另一个不带任何参数的函数。但是,通常使用(并且因此必须接受)一个参数调用通知方法:Notification对象:
以下是NSNotificationCenter Class Reference的摘录:
“notificationSelector指定的方法必须只有一个参数(NSNotification的一个实例)”
答案 3 :(得分:1)
如果最后有一个冒号,那么它需要一个参数。你没有在@selector
电话中传递任何内容。您的第一个示例是正确的,您的getCurrentData:
方法应如下所示。
-(void)getCurrentData:(NSNotification*)note
{
//Implementation
}
对于您在选择器中看到的每个冒号,它是参数所采用的方式,例如@selector(aMethod:secondArg:thirdArg:)
和@selector(aMethod:::)
都有不同的签名,但两者都需要3个参数。
答案 4 :(得分:0)
你正在尝试添加一个观察者并在同一个代码中发送一条消息,它不会那样工作。 您声明THIS方法用于响应事件,如[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myMethod :) name:@“behaviorName”object:nil];
然后在事件发生时调用它,你可以通过object参数传递一个特殊的对象来处理它。但是,冒号后面应该传递一个特殊事件封装对象(显然是NSNotification),请参阅文档,您应该设计myMethod:方法。如果你省略了方法代码中的对象,那么尝试调用它失败是有道理的,因为你正在调用另一个方法,实际上是一个重载:p