Нераспознанный селектор NotificationCenter Swift 3

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

Мой код

func foo() {
    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(notification:)
4. "fetchedUser:"

И еще десять вариантов, может быть. Может кто-нибудь помочь мне?


person ndPPPhz    schedule 01.12.2016    source источник
comment
Это дает вам ошибку компилятора?   -  person Arpit Dongre    schedule 01.12.2016
comment
Вы тоже читали его?   -  person Idan    schedule 01.12.2016
comment
Самодостаточный пример: stackoverflow.com/questions/39351781/.   -  person Martin R    schedule 01.12.2016
comment
Какое полное/точное сообщение об ошибке?   -  person Martin R    schedule 01.12.2016


Ответы (4)


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

func notifFunction(_ notification: Notification)

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

func fetchedUser(_ notification: Notification){

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

#selector(fetchedUser(_:))

Для удобства вы можете использовать расширение 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)
person vadian    schedule 01.12.2016
comment
Вы уверены в обязательном подчеркивании? Тогда почему этот stackoverflow.com/a/39352319/1187415 работает? Или я что-то упускаю? - person Martin R; 01.12.2016
comment
Я не уверен, но все системные уведомления имеют эту подпись (вероятно, из-за совместимости с ObjC) - person vadian; 01.12.2016

Это работает на моем проекте.

Уведомление о публикации

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)
              }
          }
      }
 }

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

person Amrit Tiwari    schedule 01.12.2016

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

NotificationCenter.default.addObserver(self, selector: #selector(YourClassName.fetchedUser), name: notificationName, object: nil)
person Ram    schedule 01.12.2016

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

person ndPPPhz    schedule 01.12.2016