2015-06-06 92 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)功能包含了新的颜色我从Storyboard链接的导航栏。

这里是我的自定义导航控制器类:

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

如果'黄昏()'没有参数,将选择器更改为'黄昏',摆脱':'。 – vacawama

+0

@vacawama修正了上面的代码 – cyril

+0

'func dusk(notification: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

相关问题