关于NSNotification Center的2个快速方法

时间:2011-08-23 12:59:59

标签: objective-c

在我找到的所有教程或示例中,它们在选择器名称(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之外使用它时就可以了。有没有办法在这里做我想要的?

5 个答案:

答案 0 :(得分:3)

首先,大多数示例都假设您将通知传递给方法。例如:

- (void)respondToNotification:(NSNotification *);

这将表示为:

@selector(respondToNotification:)

如果你删除了这个参数,那就是

@selector(respondToNotification)

对于第二项,您不能以这种方式指定参数。您需要以接收通知作为参数的方式构建方法,然后您可以检查通知并调用另一种方法来执行您需要的任何操作。

答案 1 :(得分:2)

NSNotificationCenter发送通知时(通过您指定的选择器 - 例如getCurrentData:),它将传递NSNotification的实例,因此您的方法必须接受一个参数,即这样的例子。

请参阅http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/Reference/Reference.html

答案 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