2017-06-14 25 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,也將努力

相關問題