2017-06-14 74 views
0

通知中心固定在从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) 
+0

观看WWDC视频“中的新增功能基金会”关于在斯威夫特的关键路径,实现信息和你如何能做到用块/关闭的观察,而不是回调。 https://developer.apple.com/videos/play/wwdc2017/212/ –

回答

1

正如加里的评论中提到,你需要从调用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

0

你也可以在方法前键入@objc,也将努力

相关问题