如何swift4
问题描述:
通知中心固定在从swift3转换swift4的转换器已经改变NotificationCenter
以下观点:如何swift4
NotificationCenter.default.addObserver(self, selector: #selector(myController.myFunction(_:)), name: NSNotification.Name.NSTextView.didChangeSelectionNotification, object: myNSTextView)
因此,由于selector
在.addObserver()
myFunction的现在有@objc在前面。现在编译器正在抱怨,NSNotification.Name
类型没有成员NSTextView
。这是转换器制造的,而不是我。我很困惑。
如何解决这个问题?
更新。我发现这里的资讯How to migrate NSWorkspace notifications to Swift 4?
所以我必须使用
NotificationCenter.default.addObserver(self, selector: #selector(myController.myFunction(_:)), name: NSTextView.didChangeSelectionNotification, object: myNSTextView)
答
正如加里的评论中提到,你需要从调用Selector
切换,而是使用一个回调。下面的例子显示了你需要设置这个工作。
var didBecomeActive: (Notification) -> Void = { notification in
print("app became active")
}
private func setupNotification() {
NotificationCenter.default.addObserver(forName: .UIApplicationDidBecomeActive,
object: nil,
queue: OperationQueue.main,
using: didBecomeActive)
}
首先,我创建了var didBecomeActive
,并使它成为类型的(Notification) -> Void
符合函数需要什么。在我的例子中,我在回调中留下了notification
的值,但是如果你没有使用它,你可以用_
代替它,它会正常工作。
下,而不是调用函数使用:
NotificationCenter.default.addObserver(self, selector: #selector(myController.myFunction(_:)), name: NSTextView.didChangeSelectionNotification, object: myNSTextView)
我打电话,而不是执行以下操作:
NotificationCenter.default.addObserver(forName: <#T##NSNotification.Name?#>,
object: <#T##Any?#>,
queue: <#T##OperationQueue?#>,
using: <#T##(Notification) -> Void#>)
对于using
PARAM,只需提供您设置接收回调变量,在这种情况下是didBecomeActive
。
答
你也可以在方法前键入@objc,也将努力
观看WWDC视频“中的新增功能基金会”关于在斯威夫特的关键路径,实现信息和你如何能做到用块/关闭的观察,而不是回调。 https://developer.apple.com/videos/play/wwdc2017/212/ –