【问题标题】:NSNotifications in Swift 3Swift 3 中的 NSNotifications
【发布时间】:2016-11-13 14:03:36
【问题描述】:

新通知目前在 Swift 3 中不可用吗?

我在做:

NotificationCenter.default().post(name: DidTouchParticleView, object: self.particle as? AnyObject)

在自定义视图的 touchesBegan() 中,如果有 particle 对象,我需要将其发送到视图控制器。所以我这样做:

NotificationCenter.default().addObserver(forName: DidTouchParticleView, 
                                         object: self,
                                         queue: OperationQueue.main(),
                                         using: presentParticleDisplayView(notification:))

在视图控制器的viewDidLoad() 中。我确信当我点击我的自定义视图时会出现那个特定的视图控制器,但是,函数 presentParticleDisplayView(notification:) 永远不会被调用。

另外,DidTouchParticleView 的全局定义如下:

let DidTouchParticleView = NSNotification.Name("didTouchParticleView")

这是因为测试版,还是我做错了什么?

【问题讨论】:

  • 在当前的测试版中,以及以后的 Swift 3 中,default() 之后的括号被删除;它是NotificationCenter.default

标签: ios swift3 beta nsnotifications


【解决方案1】:

您正在等待自己发布通知 (object: self)。在addObserver 调用中,您可能指的是object: particleobject: nil 之类的东西(但请注意确保它是处理程序中的正确粒子)。重新阅读此方法的文档并仔细注意 object 参数的用途。

请注意,此版本的addObserver 返回一个观察者对象。您必须将其存储起来,以便稍后使用它调用removeObserver

【讨论】:

  • object 更改为 nil 即可解决此问题。但是,它怎么知道什么变成了观察者呢?之前,在 Swift 2 中,曾经有 addObserver: 将一个对象作为观察者。
  • @YoussefSami 不,你不明白之前发生了什么。 object从不观察者。观察者从调用中返回。不要将此与addObserver(_:selector:name:object:) 混淆,其中第一个参数观察者。现在看看我编辑的答案。
  • @matt 是的,这就是我所指的那个。那么通知中心现在是如何知道要向哪个对象发送通知的呢?
  • @YoussefSami 一如既往。第一个参数是将选择器发送到的目标。正如我所说,请参阅我编辑的答案。
【解决方案2】:

听起来您可能打算调用addObserver(_:selector:name:object:),其中第二个参数消息(selector:)被发送到第一个参数(目标)。

相反,您调用了错误的方法addObserver(forName:object:queue:using:),它的工作方式完全不同。

另外,关于你问题的第二部分:

let DidTouchParticleView = NSNotification.Name("didTouchParticleView")

这是正确的(几乎);应该是

let DidTouchParticleView = Notification.Name("didTouchParticleView")

所有通知名称现在都是Notification.Name 实例。这样做的正确方法是:

extension Notification.Name {
    static let didTouchParticleView = Notification.Name("didTouchParticleView")
}

然后,您可以在整个代码中将通知名称称为.didTouchParticleView

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 2017-01-18
    • 2017-07-26
    • 2017-04-02
    相关资源
    最近更新 更多