2016-04-26 2 views
1

Я пытаюсь изменить цвет оттенка своего навигационного блока, если получаю push-уведомление, но оно не работает.Изменить цвет оттенка NavBar в AppDelegate при получении PushNotif

Так я думал, что это будет работать это:

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) { 
self.setupUserInterface(color: UIColor(red: 208.0/255.0, green: 2.0/255.0, blue: 27.0/255.0, alpha: 1.0)) 
} 

func setupUserInterface(color color: UIColor) { 
    // Navigation Bar 
    UINavigationBar.appearance().barTintColor = color 

    if let barFont = UIFont(name: "Avenir-Medium", size: 17.0) { 
     UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName:UIColor.whiteColor(), NSFontAttributeName:barFont] 
    } 

    UINavigationBar.appearance().tintColor = UIColor.whiteColor() 

    // Status Bar 
    UIApplication.sharedApplication().statusBarStyle = .LightContent 
} 

Я знаю, что PushNotif получено правильно и все остальное работает нормально, но интерфейс не реагирует на это. Нужно ли менять его по-другому?

+0

Ваша функция вызвана? – NSGangster

+0

Да, но ничего не меняется – sesc360

+0

Изменение UIAppearance изменит только новые navBar, которые сделаны, а не экземпляры NavBar, которые уже сделаны. Я сейчас работаю над ответом, который включает расширение класса UINavigationBar. – NSGangster

ответ

0

Создать UINavigationBarExtension

extension UINavigationBar { 
    func didGetNotification(color : UIColor) { 
     self.barTintColor = color 
     //Do any other visual changes to current navBar instance here. 
    } 
} 
//I would keep most stuff in this function if you want new navBar's to have changes. 
func setupUserInterface(color color: UIColor) { 
    // Navigation Bar 
    UINavigationBar.appearance().barTintColor = color 

    if let barFont = UIFont(name: "Avenir-Medium", size: 17.0) { 
     UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName:UIColor.whiteColor(), NSFontAttributeName:barFont] 
    } 

    UINavigationBar.appearance().tintColor = UIColor.whiteColor() 

    // Status Bar 
    UIApplication.sharedApplication().statusBarStyle = .LightContent 

    // Using self.window assuming you are in AppDelegate.swift 
    //Grab instance of current navBar and call your function that changes apperance. 
    (self.window.rootViewController as? UINavigationController).navigationBar.didGetNotification(color) 
} 

Это будет работать, если панель навигации контроллер rootView из окна, которое в большинстве случаев это. Если это не так, вам придется придумать другой способ захватить экземпляр navBar, но вызов функции будет таким же.

+0

Просто осознал, что вы прошли в цвете, чтобы быть измененным, вы тоже навигация. Я уточню свой ответ. – NSGangster

1

Ваш код работает, но только на вновь созданный UINavigationController (который вы обычно не создаете повторно). Это означает, что вам необходимо вручную обновить уже существующий навигационный контроллер.

Есть несколько способов реализации этого, некоторые легче, некоторые безопаснее, но здесь очень простой пример использования Кво Уведомления.Парковка

func setupUserInterface(color color: UIColor) { 
    // Navigation Bar 
    UINavigationBar.appearance().barTintColor = color 

    if let barFont = UIFont(name: "Avenir-Medium", size: 17.0) { 
     UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName:UIColor.whiteColor(), NSFontAttributeName:barFont] 
    } 

    UINavigationBar.appearance().tintColor = UIColor.whiteColor() 

    // Status Bar 
    UIApplication.sharedApplication().statusBarStyle = .LightContent 

    // Informs the whole app to refresh if they have a navigation controller 
    NSNotificationCenter.defaultCenter().postNotificationName("awesomeNotificationKey", object: color) 
} 

Затем зарегистрировать для этого уведомления, либо в подклассе UINavigationController или в a UIViewController, который находится в стеке навигационного контроллера. Этот пример будет в UIViewController:

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(SomeController.refreshNavigationBar(_:)), name:"awesomeNotificationKey", object: nil); 
} 

func refreshNavigationBar(notification: NSNotification) { 
    let color = notification.object as! UIColor 
    navigationController?.navigationBar.barTintColor = color 
} 

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

+0

@ sesc360 Это лучший ответ, чем мой, особенно если ваш navigationController не является rootViewController вашего окна. – NSGangster

+0

Интересно, можете ли вы создать расширение в UINavigationController, переопределить viewDidLoad() и addObserver (self) там, чтобы каждый UINavigationController в приложении получал уведомление? Как бы вы оценили этот подход @Kumuluzz? – NSGangster

+0

К сожалению, невозможно переопределить стандартные методы жизненного цикла в расширении, но в любом случае я бы предпочел подклассифицировать 'UINavigationController' на нечто вроде' PushResponsiveNavigationController', в котором я бы переопределил 'viewDidLoad'. Я предпочитаю это расширение по двум причинам: он имел бы лучшую читаемость раскадровки/кода по сравнению с расширением, а также позволял бы иметь 'UINavigationController', который не реагирует на push. – Kumuluzz

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