【问题标题】:Is it necessary to receive a NSNotification when adding an observer?添加观察者时是否需要接收 NSNotification?
【发布时间】:2011-04-12 05:24:02
【问题描述】:

事情是这样的..

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

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

按钮操作也是如此。总是喜欢:

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

我只是做了一些测试,不管有没有参数,方法都会被调用。 这真的有必要吗?什么原因?

谢谢你!!!

【问题讨论】:

  • 您有什么原因不想想要包含它们?打字太多?

标签: iphone objective-c cocoa-touch ipad


【解决方案1】:

来自NSNotificationCenter doc:

通知选择器
选择器,指定接收者发送的消息 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。

【讨论】:

    【解决方案2】:

    当我发现我可以在没有任何参数的情况下调用这些方法时,我就这么做了。在大多数情况下它工作得很好,但在某些情况下它显示NSInvalidArgumentException。为了安全起见,最好提及这些论点。

    这是一个不使用参数导致应用崩溃的示例:

    MultipleControllers in one view

    【讨论】:

      【解决方案3】:

      根据苹果文档。 iOS中按钮的接收者可以是-(void)action, -(void)action:(id)sender。并且通知也可以有参数 NSNotification 或者没有参数。这取决于您的需求。

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

      更新 必须添加 NSNotification 参数。 The reference document link.

      【讨论】:

      • 通知也可以有参数 NSNotification 或没有参数。请链接到说这个的文档,因为我的文档没有说任何这样的东西。
      • 对不起,我提供了错误的信息。我更新了我的帖子,并提供了一个文档链接。并感谢您的纠正。 :)
      猜你喜欢
      • 2015-10-05
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      • 2020-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-18
      相关资源
      最近更新 更多