添加观察者时是否需要接收NSNotification?

时间:2011-04-12 05:24:02

标签: iphone objective-c cocoa-touch ipad

这就是事情..

每次我看到一个关于网络相关iphone的例子 - ipad dev,我看到每次控制器注册自己的通知时,回调方法就像:

-(void)mymethod:(NSNotification *)notification {
    //Bla Bla
}

与按钮动作相同..总是喜欢:

- (void)actionmethod:(id)sender {
     //Bla Bla
}

我只是进行了一些测试,无论是否带参数,都会调用该方法。 这真的有必要吗?出于什么原因?

谢谢你!!!

3 个答案:

答案 0 :(得分:3)

来自NSNotificationCenter doc

  

notificationSelector
  选择器,指定接收方发送 notificationObserver 的消息,以通知其通知发布。 notificationSelector 指定的方法必须具有一个且仅有一个参数(NSNotification的实例)。

[强调我的。]

您必须为选择器提供正确的签名;如果你不这样做,它可能会起作用,但它可能会在你不想要的时候停止工作。

您可能希望获取通知的原因是,您可以使用userInfo字典的形式传递信息,您可以在使用notificationWithName:object:userInfo:发布通知时指定该字典。调用方法时可以忽略参数,但参数必须在方法签名中。

对于按钮及其操作,docs表示您可以拥有三个签名中的一个*:

  

UIKit框架允许三种不同形式的动作选择器:
  - (void)action
  - (void)action:(id)sender
  - (void)action:(id)sender forEvent:(UIEvent *)event

IBAction返回类型等同于void(没有返回值),除了它在头中的方法中的存在允许Interface Builder知道该方法是作为一个动作,以便您可以连接控件。

想要获得按钮(或其他控件)的原因与通知类似。如果您的界面中有许多按钮,其中一些按钮(例如在表格视图中)连接到同一个动作,您可能需要通过按下按钮的标识区分您所做的确切事情。


*:为了完整起见,我想提一下,这是Mac上的情况;在那里,一个动作方法必须具有以下形式:- (IBAction)action:(id)sender

答案 1 :(得分:1)

当我发现我可以在没有任何争论的情况下调用这些方法时,我只做到了这一点。它适用于大多数情况,但在某些情况下它显示NSInvalidArgumentException。为了安全起见,最好提一下这些论点。

以下是不使用参数导致应用程序崩溃的示例:

MultipleControllers in one view

答案 2 :(得分:0)

根据苹果文件。 iOS中按钮的接收器可以是 - (void)动作, - (void)动作:(id)发送者。并且通知还可以具有参数NSNotification或无参数。这取决于你的需求。

例如,我需要通过通知传输UIImage,因此我将UIImage添加到NSNotification的userInfo字典中。与发件人一样,如果我需要发件人的某些属性,我将添加(id)发件人作为参数。通常,我喜欢为 - (id)sender或NSNotification添加这些参数。如果我需要来自通知或发件人的某些信息,那么我不需要更改原始方法,因为他们已经有发送者或通知对象来获取我需要的信息。

<强>更新 必须添加NSNotification参数。 The reference document link