Почему мой NSNotificationCenter выдает исключение?

У меня есть контроллер табличного представления с распознавателем жестов, который запускает NSNotificationCenter.defaultCenter().postNotificationName("DuskTheme", object: nil) всякий раз, когда пользователь проводит пальцем вверх.

В функции viewDidLoad() у меня есть следующий наблюдатель: NSNotificationCenter.defaultCenter().addObserver(self, selector: "dusk:", name:"DuskTheme", object: nil), который вызывает функцию dusk(notification: NSNotification), которая изменяет цвет элементов на текущем контроллере представления (т.е. теме).

Я также хотел изменить цвет моей панели навигации всякий раз, когда пользователь проводит пальцем по экрану, поэтому я создал подкласс для navigationController и добавил следующий наблюдатель к его viewDidLoad(): NSNotificationCenter.defaultCenter().addObserver(self, selector: "dusk:", name:"DuskTheme", object: nil), а также функцию dusk(notification: NSNotification), содержащую новый цвет для панели навигации, которую я связал из раскадровки.

Вот мой пользовательский класс контроллера навигации:

class customNavigationController: UINavigationController {
    @IBOutlet weak var featuredNavBar = ThemeManager.navigationbar

    override func viewDidLoad() {
        super.viewDidLoad()
        //Adding a theme notification observer
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "dusk:", name:"DuskTheme", object: nil)

        func dusk(notification: NSNotification) {
            UIView.animateWithDuration(1, animations: {
                UIApplication.sharedApplication().statusBarStyle = .LightContent
                self.featuredNavBar?.barTintColor = UIColor(red: 69/255, green: 69/255, blue: 69/255, alpha: 1)

            })
        }

    }

}

Теперь по какой-то причине всякий раз, когда контроллер табличного представления прокручивается, приложение выдает следующее исключение:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[TestApp.customNavigationController dusk:]: unrecognized selector sent to instance 0x7939c910'

Эта ошибка вызвана распознавателем жестов? Он работал нормально до подкласса навигационного контроллера. Что еще более важно, что было бы лучшим способом определить, что тема была изменена, и изменить цвет панели навигации?

Заранее спасибо!


person cyril    schedule 06.06.2015    source источник
comment
Если dusk() не принимает параметров, измените селектор на dusk, избавьтесь от :.   -  person vacawama    schedule 06.06.2015
comment
@vacawama исправил приведенный выше код   -  person cyril    schedule 06.06.2015
comment
Является ли func dusk(notification: NSNotification) методом верхнего уровня внутри customNavigationController (т.е. он не находится внутри другой функции, такой как viewDidLoad)?   -  person vacawama    schedule 06.06.2015
comment
Как создается ваш customNavigationController? В раскадровке? Вы изменили класс NavigationController, чтобы использовать свой собственный класс?   -  person vacawama    schedule 06.06.2015
comment
Обновил пост с моим пользовательским навигационным контроллером. Да, нет и да на другие вопросы @vacawama   -  person cyril    schedule 06.06.2015


Ответы (1)


Переместите dusk() за пределы viewDidLoad(). Это должно быть на верхнем уровне:

class customNavigationController: UINavigationController {
    @IBOutlet weak var featuredNavBar = ThemeManager.navigationbar

    func dusk(notification: NSNotification) {
        UIView.animateWithDuration(1, animations: {
            UIApplication.sharedApplication().statusBarStyle = .LightContent
            self.featuredNavBar?.barTintColor = UIColor(red: 69/255, green: 69/255, blue: 69/255, alpha: 1)

        })
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        //Adding a theme notification observer
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "dusk:", name:"DuskTheme", object: nil)
    }
}
person vacawama    schedule 06.06.2015
comment
Как получилось, что размещение его наверху исправило это? Как порядок влияет на то, как работает приложение? Я все еще новичок во всем этом и самоучка, не могли бы вы объяснить мне это? - person cyril; 06.06.2015
comment
Неважно, находится ли dusk() выше или ниже viewDidLoad, но он должен быть на том же уровне вложенности, что и viewDidLoad. Селектор вызывается в экземпляре customNavigatorController, поэтому функция должна быть функцией верхнего уровня, а не вложенной в другую функцию. - person vacawama; 06.06.2015