El botón UINavigationBar de iOS permanece desteñido después de segue volver

En mi aplicación tengo múltiples controladores de visualización, y la mayoría tiene un UIBarButtonItem lado UIBarButtonItem con UIBarButtonItem “show” directas adjuntas.

Después de pasar a otra vista y luego presionar el botón '< Back' , el elemento del botón original permanece desvanecido, aunque de todos modos se puede utilizar.

Esto solo parece suceder en iOS 11.2.

No puedo ver ninguna configuración que podría estar haciendo esto, y en al menos uno de los casos en que esto sucede, no hay un desenrollado de segue específico ni el manejo de viewDidAppear . Publicaba un código, pero AFAICS es solo el comportamiento predeterminado de UINavigationBar .

Este es un error en iOS 11.2 y ocurre porque UIBarButtonItem permanece resaltado después de la navegación y no vuelve a su estado normal después de que aparece el otro controlador de vista.

Para evitar este comportamiento, ya sea

  1. utilizar un UIBarButtonItem con un UIButton como una vista personalizada

  2. deshabilite y vuelva a habilitar el elemento del botón de barra en viewWillDisappear(_:) (aunque esto hace que el botón aparezca inmediatamente, use la solución de matt para evitar esto):

     barButtonItem.isEnabled = falso
     barButtonItem.isEnabled = true
    

Lo que hago es viewWillAppear este error, en la vista del controlador de vista viewWillAppear , de la siguiente manera:

 override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.navigationController?.navigationBar.tintAdjustmentMode = .normal self.navigationController?.navigationBar.tintAdjustmentMode = .automatic } 

Eso parece despertar el botón sin artefactos visuales.

Otra alternativa es implementar la corrección en el control de navegación padre, de modo que cada uno de sus viewControllers secundarios obtenga la solución de la siguiente manera

NOTA: Esto requiere que la clase de recepción se configure como el delegado UINavigationController

Rápido

 func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) { if #available(iOS 11.2, *) { navigationBar.tintAdjustmentMode = .normal navigationBar.tintAdjustmentMode = .automatic } } 

C objective

 -(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { if (@available(iOS 11.2, *)) { self.navigationBar.tintAdjustmentMode = UIViewTintAdjustmentModeNormal; self.navigationBar.tintAdjustmentMode = UIViewTintAdjustmentModeAutomatic; } } 

Lo solucioné así:

 override func viewWillDisappear(_ animated: Bool) { navigationController?.navigationBar.tintAdjustmentMode = .normal navigationController?.navigationBar.tintAdjustmentMode = .automatic } 

por lo que restaurará el color antes de que aparezca la otra vista