添加右按钮在NavigationController

问题描述:

我有故事板的设置与类NavigationController: UINavigationController, UIViewControllerTransitioningDelegate与自定义导航栏安装扩展导航控制器与CustomNavigationBar:UINavigationBar类下面的导航控制器的所有视图控制器是NavigationController添加右按钮在NavigationController

代码
class NavigationController: UINavigationController, UIViewControllerTransitioningDelegate { 

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

这里是为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 
    } 
} 

代码到目前为止好,我现在想用一个自定义的视图中添加合适的栏导航项目。我试着在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) 

这出于某种原因没有显示在导航菜单中添加了下面的代码。我哪里错了?

+0

你需要添加'自我.navigationItem.setRightBarButton(item,animated:false)'在您的基本视图控制器中的一部分,因为每个viewController都有它自己的navigationItem,这就是为什么您的自定义按钮没有显示。 –

+0

正如您所见,我在NavigationController中添加了这一点。我是否还需要在所有其他ViewController中添加此项? –

+0

如果你使用了一个baseViewController,并在他的viewDidLoad中添加了这个实现,并且让你的所有其他viewController继承了你的baseViewController,那么你只需要添加一次 –

你需要在你的基地视图控制器添加自定义导航按钮代码的一部分,因为每一个的viewController有它自己的navigationItem这就是为什么您的自定义按钮没有显示

你需要使用一个BaseViewController类的需求,然后继承所有的viewController从BaseViewController你只需要添加一次您的导航按钮自定义代码,在viewDidLoad

像这样的事情

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) 
    } 

} 

你可以符合你的NavigationController类UINavigationControllerDelegate协议和修改目标控制器在navigationController navigationItem(_ navigationController:UINavigationController的,willShow的viewController:UIViewController中,动画:布尔)方法:

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