Stack Overflow en español Asked by Kevtho on December 2, 2021
Necesito definir 3 templates de barras de navegación para una app, todas con un mismo color de fondo, una sin botones, otra con un solo botón de retorno en el lazo izquierdo y otra con un botón de retorno (izquierda) y uno de redirección en el lado derecho de la barra.
Personalizacion de colores y aspecto gráfico general
class BackNavController: UINavigationController {
override init(rootViewController: UIViewController) {
super.init(rootViewController: rootViewController)
confView()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
confView()
}
func confView() {
navigationBar.barTintColor = Constants.primaryColor
navigationBar.isTranslucent = false
navigationBar.barStyle = .black
}
}
Para agregar el botón de retorno del segundo template tengo el siguiente codigo dentro del ViewController
class LoginVC: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.title = "Inicar sesion"
let backButton = UIBarButtonItem(image: UIImage(named: "back-arrow")?.withRenderingMode(.automatic),style: .plain,target: nil,action: #selector(closeView))
backButton.target = self
backButton.tintColor = .white
navigationItem.leftBarButtonItem = backButton
}
@objc func closeView() {
self.dismiss(animated: true, completion: nil)
}
}
El código funciona, sin embargo el definir los botones dentro de cada ViewController no es la mejor práctica pues debería repetir una y otra vez en cada controllador. La pregunta es cómo podría redefinir este código para poder usarlo cuantas veces sea necesario. Intenté agregar los botones en la subclase BackNavController pero el botón no se muestra.
class BackNavController: UINavigationController {
override init(rootViewController: UIViewController) {
super.init(rootViewController: rootViewController)
confView()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
confView()
}
func confView() {
navigationBar.barTintColor = Constants.primaryColor
navigationBar.isTranslucent = false
navigationBar.barStyle = .black
let backButton = UIBarButtonItem(image: UIImage(named: "back-arrow")?.withRenderingMode(.automatic),style: .plain,target: nil,action: #selector(closeView))
backButton.target = self
backButton.tintColor = .white
navigationItem.leftBarButtonItem = backButton
}
@objc func closeView() {
self.dismiss(animated: true, completion: nil)
}
}
Muchas gracias por su ayuda
Lo que puedes hacer es agregar o quitar botones al Navigation Bar
después de personalizar el Navigation Controller
, en un proyecto lo tengo así:
En una clase puedes crear una función que te devuelva un UIButton
static func crearBoton(_ image: String, target: Any, selector: Selector, rect: CGRect?) -> UIButton {
let newButton = UIButton(type: .custom)
newButton.setImage(UIImage(named: image), for: .normal)
newButton.addTarget(target, action:selector, for:.touchUpInside)
if let buttonRect = rect {
newButton.frame = buttonRect
}
return newButton
}
Una función que permita crear los UIBarButtonItem
:
func createItem(target: Any, selector: Selector) -> UIBarButtonItem {
let rightButton = crearBoton(imagen: String, target, selector: selector, rect: CGRect)
return UIBarButtonItem(customView: rightButton)
}
Otra función para agregar los UIBarButtonItem
al NavigationBar
:
func addItems(_ type: String, target: Any, selector: Selector) {
let barItem = createItem(target: target, selector: selector)
if type == "left" {
navigationItem.leftBarButtonItem = barItem
} else {
navigationItem.rightBarButtonItem = barItem
}
}
En los controller que hereden esa clase y solo llamarías a esa función:
class LoginVC: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.title = "Inicar sesion"
//Llamas a la función de agregar según lo que necesites
addItems(_ type: "left", target: Any, selector: selector)
addItems(_ type: "right", target: Any, selector: selector)
}
El selector
lo defines de acuerdo a la funcionalidad del botón.
El parámetro CGRect
es opcional y lo puedes omitir.
Answered by Bicho on December 2, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP