2017-09-16 1 views
2

J'ai histoire la configuration de la carte avec tous les contrôleurs de vue extension contrôleur de navigation avec classe NavigationController: UINavigationController, UIViewControllerTransitioningDelegate avec l'installation de la barre de navigation personnalisée pour le contrôleur de navigation avec classe CustomNavigationBar:UINavigationBar Voici le code pour NavigationControllerAjouter Bouton droit En NavigationController

class NavigationController: UINavigationController, UIViewControllerTransitioningDelegate { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 
} 

Voici la code pour CustomNavigationBar

class CustomNavigationBar: UINavigationBar { 

    override func awakeFromNib() { 
     var font = UIFont(name: "Montserrat-Light", size: 17)! 
     if "ar" == userLocale() { 
      font = UIFont(name: "DroidSansArabic", size: 17)! 
     } 
     let attribtutes = [ 
      NSFontAttributeName: font, 
      NSForegroundColorAttributeName: UIColor.black, 
      NSKernAttributeName: 5.0 
      ] as [String : Any] 
     UINavigationBar.appearance().titleTextAttributes = attribtutes 
     UINavigationBar.appearance().tintColor = UIColor.black 
     UINavigationBar.appearance().backgroundColor = UIColor.white 

     let image = UIImage(named: "back-btn") 
     UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -66), for: .default) 
     UINavigationBar.appearance().backIndicatorImage = image 
    } 
} 

jusqu'ici tout va bien, je veux maintenant ajouter un élément de navigation barre droite avec une vue personnalisée. J'ai essayé d'ajouter le code suivant dans NavigationController::viewDidLoad()

let customView:UIView = UIView() 
customView.backgroundColor = .green 
customView.frame = CGRect(x: 0, y: 0, width: 100, height: 100) 
let item = UIBarButtonItem(customView: customView) 
self.navigationItem.setRightBarButton(item, animated: false) 

Ce pour une raison quelconque n'apparaît pas dans le menu de navigation. Où vais-je mal?

+0

vous avez besoin d'ajouter 'auto .navigationItem.setRightBarButton (item, animated: false) 'part dans votre contrôleur de vue de base, car chaque viewController possède son propre élément navigationItem, c'est pourquoi votre bouton personnalisé n'est pas affiché –

+0

Comme vous le voyez, j'ai ajouté cela dans NavigationController. Ai-je besoin d'ajouter cela dans tous les autres ViewController? –

+0

Si vous utilisez un baseViewController et ajoutez cette implémentation dans viewDidLoad et que vous créez tous vos autres sous-classes de viewController, vous n'avez qu'à ajouter cette fois –

Répondre

1

Vous devez ajouter votre pièce personnalisée de code du bouton de navigation dans votre contrôleur de vue de base, parce que tous les viewController ont son propre navigationItem, qui est pourquoi votre bouton personnalisé n'est pas montré

Vous devez utiliser une classe BaseViewController pour votre besoins, alors tous vos sous-classement viewController de votre BaseViewController il vous suffit d'ajouter votre bouton de navigation code de personnalisation une fois, dans viewDidLoad

Quelque chose comme ça

class BaseViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     let customView:UIView = UIView() 
     customView.backgroundColor = .green 
     customView.frame = CGRect(x: 0, y: 0, width: 100, height: 100) 
     let item = UIBarButtonItem(customView: customView) 
     self.navigationItem.setRightBarButton(item, animated: false) 
    } 

} 
0

Vous pouvez conformer votre classe NavigationController à UINavigationControllerDelegate protocole et modifier navigationItem du contrôleur cible dans NavigationController méthode (_ NavigationController: Bool UINavigationController, willShow viewController:: UIViewController, animation):

extension RootNavigationController: UINavigationControllerDelegate { 
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) { 
    if let viewController = viewController as? YOURCONTROLLER { 
     viewController.navigationItem.setRightBarButton(YOURITEM, animated: false) 
    } 
}