Swift 3 中的 NSNotifications

NSNotifications in Swift 3

新通知目前在 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")

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

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

请注意,此版本 addObserver returns 一个观察者对象。您必须存储它,以便稍后调用 removeObserver

听起来您可能打算调用 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