1

Ceci est une question un peu différente de celle précédemment demandée. Alors soyez gentil.Comment personnaliser UINavigationBar pour l'ensemble de l'application?

  • L'application entière a une barre de navigation avec des couleurs différentes.
  • L'application entière a peu d'options dans sa barre de navigation. Ils sont tous pareils.

Qu'est-ce que j'attends?

J'ai créé cette extension pour UINavigationController et en mesure de changer la couleur d'arrière-plan de la barre de navigation selon le contrôleur de vue que je serai.

extension UINavigationController { 

    func updateNavigationBar(withViewControllerID identifier: String?) { 

     setupNavigationBarButtons() 

     if identifier == kFirstVCIdentifier { 
      self.navigationBar.tintColor = .white 
      self.navigationBar.barTintColor = .red 
     } else if identifier == kSecondVCIdentifier { 
      self.navigationBar.tintColor = .white 
      self.navigationBar.barTintColor = .green 
     } else if identifier == kThirdVCIdentifier { 
      self.navigationBar.tintColor = .white 
      self.navigationBar.barTintColor = .blue 
     } 

     self.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white] 

     self.navigationBar.isTranslucent = false 
     self.navigationBar.clipsToBounds = false 
     self.navigationBar.shadowImage = UIImage.init() 
     self.view.backgroundColor = .clear 
    } 

    internal func setupNavigationBarButtons() { 
     let barButtonItemSettings = UIBarButtonItem.init(title: "Settings", style: .plain, target: self, action: #selector(actionSettings)) 
     let barButtonItemSpace = UIBarButtonItem.init(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) 
     let barButtonItemLogOut = UIBarButtonItem.init(title: "LogOut", style: .plain, target: self, action: #selector(actionLogOut)) 
     let buttons = [barButtonItemSettings, barButtonItemSpace, barButtonItemLogOut] 
     self.navigationItem.rightBarButtonItems = buttons 
    } 

    @objc internal func actionSettings() { 
     print("Settings") 
    } 

    @objc internal func actionLogOut() { 
     print("LogOut") 
    } 
} 

, je suis en train d'ajouter UIBarButton dans cette extension, mais ils ne sont pas montrés. Donc j'ai besoin de le réparer. Et si elle est visible, comment puis-je appeler ses actions pour que je puisse gérer l'événement tactile de UIBarButton dans toute l'application. Correctement? Pas de patch, s'il vous plaît.

Je l'utilise comme ceci:

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated)  
    self.navigationController?.updateNavigationBar(withViewControllerID: self.restorationIdentifier?) 
} 
+0

vous pouvez masquer la barre de navigation et faire vue personnalisée –

+0

Avez-vous essayé de changer la cible auto à self.viewControllers.last, il pourrait aider –

Répondre

2

Essayez et Faire extension pour UINavigationItem.

extension UINaviationItem { 

func setupNavigationBarButtons() 
{ 
    let barButtonItemSettings = UIBarButtonItem.init(title: "Settings", style: .plain, target: self, action: #selector(actionSettings)) 
    let barButtonItemSpace = UIBarButtonItem.init(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) 
    let barButtonItemLogOut = UIBarButtonItem.init(title: "LogOut", style: .plain, target: self, action: #selector(actionLogOut)) 
    let buttons = [barButtonItemSettings, barButtonItemSpace, barButtonItemLogOut] 
    self.rightBarButtonItems = buttons 
} 

@objc func actionSettings() { 

    print("Settings") 

    if let current = UIApplication.shared.delegate?.window 
    { 
     var viewcontroller = current!.rootViewController 
     if(viewcontroller is UINavigationController){ 
      viewcontroller = (viewcontroller as! UINavigationController).visibleViewController 

      print("currentviewcontroller is %@/",viewcontroller)  
    } 
    } 
} 
@objc func actionLogOut() { 
    print("LogOut") 
} 

} 

self.navigationController?.updateNavigationBar(withViewControllerID: "second") 
self.navigationItem.setupNavigationBarButtons() 
+0

@Hemang pourquoi vous en avez besoin. Vous pouvez utiliser delegate ou viewcontroller sur le bouton de la barre. Selon votre je reçois le contrôleur visible actuel. s'il vous plaît vérifier la mise à jour réponse sur le réglage cliquez sur. –

+0

@Hemang J'écris le code du présentateur viisble actuel –