Сбой NotificationCenter в Swift 3

Мне кажется, или NotificationCenter в Swift 3 превратился в беспорядок? :)

У меня есть следующая установка:

// Yonder.swift
extension Notification.Name {
  static let preferenceNotification = Notification.Name("preferencesChanged")
}

// I fire the notification elsewhere, like this:
NotificationCenter.default.post(name: .preferenceNotification, object: nil)

В моем первом контроллере представления это прекрасно работает:

// View Controller A <-- Success!
NotificationCenter.default.addObserver(self, selector: #selector(refreshData), name: .preferenceNotification, object: nil)

func refreshData() {
  // ...
}

Но этот контроллер представления:

//View Controller B <-- Crash :(
NotificationCenter.default.addObserver(self, selector: #selector(loadEntries(search:)), name: .preferenceNotification, object: nil)

func loadEntries(search:String?) {
  // ...
}

... вылетает с:

[Длина NSConcreteNotification]: в экземпляр отправлен нераспознанный селектор

Насколько я могу судить, мой наблюдатель настроен правильно. Любая идея, что я делаю неправильно?


person Clifton Labrum    schedule 17.11.2016    source источник
comment
Возможный дубликат NSNotifications в Swift 3   -  person Anand Nimje    schedule 17.11.2016


Ответы (1)


Ваша проблема связана с вашим методом loadEntries(search:). Это недействительная подпись. Селектор, используемый с Центром уведомлений, не должен иметь параметров или иметь только один параметр. И если у вас есть один параметр, этот параметр будет объектом Notification, а не именем уведомления.

Ваш loadEntries должен быть:

func loadEntries(_ notification: NSNotification) {
    // Optional check of the name
    if notification.name == .preferenceNotification {
    }
}

И селектор должен быть:

#selector(loadEntries(_:)) // or #selector(loadEntries)
person rmaddy    schedule 17.11.2016
comment
Ах я вижу. Спасибо! - person Clifton Labrum; 17.11.2016