0

Я прочитал все возможные решения по переполнению стека, но ни один из них не работает для меня.Непризнанный селектор NotificationCenter Swift 3

Мой код

NotificationCenter.default.addObserver(self, selector: #selector(fetchedUser(notification:)) , name: NSNotification.Name.init("dbReady"), object: nil) 

    loggedUser.fetchUserByUID(id: current.uid) 


    return true 
} 

func fetchedUser(notification:NSNotification){ 

    let info = notification.object as! [String : AnyObject] 
    print(info) 

} 

и в другом классе Я:

NotificationCenter.default.post(name: NSNotification.Name.init("dbReady"), object: dictionary) 

Все синтаксису селектора не работает

Я пробовал:

  1. fetchedUser
  2. fetchedUser:
  3. fetchedUser (уведомление :)
  4. "fetchedUser:"

И другие 10 может быть. этот вопрос заставляет меня сходить с ума!

Может ли кто-нибудь мне помочь?

+0

Это дает вам ошибку компилятора? –

+0

[Вы тоже читали его?] (Http://stackoverflow.com/a/40757389/5099208) – Idan

+0

Самостоятельный пример: http://stackoverflow.com/questions/39351781/swift-2-0- к быстротекущей 3-0-nsnotification-уведомления. –

ответ

0

Моя ошибка была в том, что не существует селектор с именем «fetchedUserWithNotification:». Я решаю свою проблему через 3 часа, переписывая новый класс, копируя и вставляя весь контент. Возможно, это была ошибка Xcode (IMHO, последняя версия - это много)

1

В уведомлениях Swift 3, (система) имеют эту стандартную подпись:

func notifFunction(_ notification: Notification) 

Так что ваша функция должна быть

func fetchedUser(_ notification: Notification){ 

И соответствующий селектор

#selector(fetchedUser(_:)) 

Для сотрудничества nvenience вы можете использовать расширение Notification.Name

extension Notification.Name { 
    static let databaseReady = NSNotification.Name("dbReady") 
} 

Тогда вы можете написать

NotificationCenter.default.addObserver(self, selector: #selector(fetchedUser_:)) , name: .databaseReady, object: nil) 

и

NotificationCenter.default.post(name: .databaseReady, object: dictionary) 
+1

Вы уверены в обязательном подчеркивании? Тогда почему этот http://stackoverflow.com/a/39352319/1187415 работает? Или я что-то пропускаю? –

+0

Я не уверен, но все системные уведомления имеют эту подпись (возможно, из-за совместимости с ObjC) – vadian

0

вы можете попробовать это

NotificationCenter.default.addObserver(self, selector: #selector(YourClassName.fetchedUser), name: notificationName, object: nil) 
0
class Observer { 

    init() { 
     let name = NSNotification.Name("TestNotification") 

     NotificationCenter.default.addObserver(self, 
               selector: #selector(notificationDidTrigger), name: name, object: nil) 
    } 

    @objc func notificationDidTrigger(notification: Notification) { 
     print("Notification triggered ", notification.userInfo) 
    } 
} 


let obj = Observer() 

let name = NSNotification.Name("TestNotification") 
var notification = Notification(name: name, object: nil) 
notification.userInfo = ["Name": "My notification"] 
NotificationCenter.default.post(notification) 
1

Работает в моем проекте.

Сообщение Уведомление

let dic: [String:AnyObject] = ["news_id": 1 as AnyObject,"language_id" : 2 as AnyObject] 
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "NotificationKeyIndentifier"), object: dic) 

Уведомление наблюдатель

Добавьте следующий код на нужном классе, где вы хотите наблюдать.

NotificationCenter.default.addObserver(self, selector: #selector(self.handlePushNotification(notification:)), name: NSNotification.Name(rawValue: "NotificationKeyIndentifier"), object: nil) 

Это функция, которая является триггером после наблюдения наблюдателя.

func handlePushNotification(notification: NSNotification){ 

    if let dic = notification.object as? [String: AnyObject]{ 

     if let language_id = dic["language_id"] as? Int{ 

      if let news_id = dic["news_id"] as? Int{ 
        print(language_id) 
        print(news_id) 
       } 
      } 
     } 
} 

Надеюсь, это может вам помочь. Если у вас есть какие-либо проблемы в этом вопросе, заполните, пожалуйста, вопросы.

Смежные вопросы