2015-06-06 1 views
0

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

В функции 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' 

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

Заранее благодарен!

+0

Если 'dusk()' не принимает параметров, измените селектор на 'dusk', избавьтесь от': '. – vacawama

+0

@vacawama исправил вышеуказанный код – cyril

+0

Является ли 'func dusk (уведомление: NSNotification)' метод верхнего уровня внутри 'customNavigationController' (т. Е. Он не находится внутри другой функции, такой как' viewDidLoad')? – vacawama

ответ

2

Переместить 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) 
    } 
} 
+0

Как это, если положить его наверху? Как порядок влияет на способ запуска приложения? Я все еще новичок в этом и самоучках, не могли бы вы объяснить это мне? – cyril

+2

Не имеет значения, находится ли 'dusk()' выше или ниже 'viewDidLoad', но он должен находиться на том же уровне вложенности, что и' viewDidLoad'. Селектор вызывается на экземпляре 'customNavigatorController', поэтому функция должна быть функцией верхнего уровня и не вложена внутри другой функции. – vacawama

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