right plus item bar ios swift uibarbuttonitem navigationbar

ios - plus - uibarbuttonitem action swift 4



UIBarButtonItem en la barra de navegaciĆ³n mediante programaciĆ³n? (9)

Configuración de LeftBarButton con imagen original.

let menuButton = UIBarButtonItem(image: UIImage(named: "imagename").withRenderingMode(.alwaysOriginal), style: .plain, target: self, action: #selector(classname.functionname)) self.navigationItem.leftBarButtonItem = menuButton

He estado buscando esta solución por un tiempo, pero no tengo ninguna. por ejemplo, una solución es

self.navigationItem.setRightBarButtonItem(UIBarButtonItem(barButtonSystemItem: .Stop, target: self, action: nil), animated: true)

Este código agregará un botón con la imagen "stop". De esta manera, hay otras soluciones con "buscar", "actualizar", etc. Pero, ¿qué sucede si quiero agregar un botón mediante programación con la imagen que quiero?


En Swift 3 para la acción en el botón de la barra:

let testUIBarButtonItem = UIBarButtonItem(image: UIImage(named: "test.png"), style: .plain, target: self, action: #selector(ViewController.clickButton)) self.navigationItem.rightBarButtonItem = testUIBarButtonItem func clickButton(){ print("button click") }


Es mucho más fácil con Swift 4 o Swift 4.2

dentro de su método ViewDidLoad , defina su botón y agréguelo a la barra de navegación.

override func viewDidLoad() { super.viewDidLoad() let logoutBarButtonItem = UIBarButtonItem(title: "Logout", style: .done, target: self, action: #selector(logoutUser)) self.navigationItem.rightBarButtonItem = logoutBarButtonItem }

entonces necesita definir la función que mencionó dentro del parámetro de acción como se muestra a continuación

@objc func logoutUser(){ print("clicked") }

@objc agregar el prefijo @objc ya que todavía hace uso del material heredado (Objetivo C).


Esto es una locura de manzana. Cuando diga self.navigationItem.rightBarButtonItem.title, dirá nil mientras que en la GUI muestra Editar o Guardar. A Fresher le gusto. Tomará mucho tiempo depurar este comportamiento.

Existe el requisito de que el elemento muestre Editar en la primera carga y luego el usuario lo toque. Cambiará a Guardar título. Para archivar esto, hice lo siguiente.

// la vista se cargó dirá Editar título

private func loadRightBarItem() { let logoutBarButtonItem = UIBarButtonItem(title: "Edit", style: .done, target: self, action: #selector(handleEditBtn)) self.navigationItem.rightBarButtonItem = logoutBarButtonItem }

// toque Editar elemento cambiará a Guardar título

@objc private func handleEditBtn() { print("clicked on Edit btn") let logoutBarButtonItem = UIBarButtonItem(title: "Save", style: .done, target: self, action: #selector(handleSaveBtn)) self.navigationItem.rightBarButtonItem = logoutBarButtonItem blockEditTable(isBlock: false) }

// toca Guardar elemento mostrará Editar título

@objc private func handleSaveBtn(){ print("clicked on Save btn") let logoutBarButtonItem = UIBarButtonItem(title: "Edit", style: .done, target: self, action: #selector(handleEditBtn)) self.navigationItem.rightBarButtonItem = logoutBarButtonItem saveInvitation() blockEditTable(isBlock: true) }


Me encontré con esta pregunta y aquí hay una actualización para Swift 3 y iOS 10:

let testUIBarButtonItem = UIBarButtonItem(image: UIImage(named: "test.png"), style: .plain, target: self, action: nil) self.navigationItem.rightBarButtonItem = testUIBarButtonItem

Definitivamente es mucho más rápido que crear el UIButton con todas las propiedades y luego agregar el CustomView al UIBarButtonItem.

Y si desea cambiar el color de la imagen del azul predeterminado a, por ejemplo, blanco, siempre puede cambiar el color del tinte:

test.tintColor = UIColor.white()

PD: obviamente, debe cambiar el selector, etc. para su aplicación :)


Simplemente configure UIBarButtonItem con customView

Por ejemplo:

var leftNavBarButton = UIBarButtonItem(customView:yourButton) self.navigationItem.leftBarButtonItem = leftNavBarButton

o use setFunction :

self.navigationItem.setLeftBarButtonItem(UIBarButtonItem(customView: yourButton), animated: true);


Tengo el mismo problema y he leído las respuestas en otro tema y luego resuelvo otra forma similar. No sé cuál es más efectivo. problema similar

//play button @IBAction func startIt(sender: AnyObject) { startThrough(); }; //play button func startThrough() { timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("updateTime"), userInfo: nil, repeats: true); let pauseButton = UIBarButtonItem(barButtonSystemItem: .Pause, target: self, action: "pauseIt"); self.toolBarIt.items?.removeLast(); self.toolBarIt.items?.append( pauseButton ); } func pauseIt() { timer.invalidate(); let play = UIBarButtonItem(barButtonSystemItem: .Play, target: self, action: "startThrough"); self.toolBarIt.items?.removeLast(); self.toolBarIt.items?.append( play ); }


Imagen de botón personalizada sin configurar el marco del botón:

Puede usar init(image: UIImage?, style: UIBarButtonItemStyle, target: Any?, action: Selector?) Para inicializar un nuevo elemento utilizando la imagen especificada y otras propiedades.

let button1 = UIBarButtonItem(image: UIImage(named: "imagename"), style: .plain, target: self, action: Selector("action")) // action:#selector(Class.MethodName) for swift 3 self.navigationItem.rightBarButtonItem = button1

Mira este documento de Apple. referencia

UIBarButtonItem con imagen de botón personalizada con marco de botón

PARA Swift 3.0

let btn1 = UIButton(type: .custom) btn1.setImage(UIImage(named: "imagename"), for: .normal) btn1.frame = CGRect(x: 0, y: 0, width: 30, height: 30) btn1.addTarget(self, action: #selector(Class.Methodname), for: .touchUpInside) let item1 = UIBarButtonItem(customView: btn1) let btn2 = UIButton(type: .custom) btn2.setImage(UIImage(named: "imagename"), for: .normal) btn2.frame = CGRect(x: 0, y: 0, width: 30, height: 30) btn2.addTarget(self, action: #selector(Class.MethodName), for: .touchUpInside) let item2 = UIBarButtonItem(customView: btn2) self.navigationItem.setRightBarButtonItems([item1,item2], animated: true)

PARA Swift 2.0 y Swift 2.0 anteriores

let btnName = UIButton() btnName.setImage(UIImage(named: "imagename"), forState: .Normal) btnName.frame = CGRectMake(0, 0, 30, 30) btnName.addTarget(self, action: Selector("action"), forControlEvents: .TouchUpInside) //.... Set Right/Left Bar Button item let rightBarButton = UIBarButtonItem() rightBarButton.customView = btnName self.navigationItem.rightBarButtonItem = rightBarButton

O simplemente use init(customView:) como

let rightBarButton = UIBarButtonItem(customView: btnName) self.navigationItem.rightBarButtonItem = rightBarButton

Para el sistema UIBarButtonItem

let camera = UIBarButtonItem(barButtonSystemItem: .Camera, target: self, action: Selector("btnOpenCamera")) self.navigationItem.rightBarButtonItem = camera

Para establecer más de 1 elementos, use rightBarButtonItems o para el lado izquierdo leftBarButtonItems

let btn1 = UIButton() btn1.setImage(UIImage(named: "img1"), forState: .Normal) btn1.frame = CGRectMake(0, 0, 30, 30) btn1.addTarget(self, action: Selector("action1:"), forControlEvents: .TouchUpInside) let item1 = UIBarButtonItem() item1.customView = btn1 let btn2 = UIButton() btn2.setImage(UIImage(named: "img2"), forState: .Normal) btn2.frame = CGRectMake(0, 0, 30, 30) btn2.addTarget(self, action: Selector("action2:"), forControlEvents: .TouchUpInside) let item2 = UIBarButtonItem() item2.customView = btn2 self.navigationItem.rightBarButtonItems = [item1,item2]

Usando setLeftBarButtonItem o setRightBarButtonItem

let btn1 = UIButton() btn1.setImage(UIImage(named: "img1"), forState: .Normal) btn1.frame = CGRectMake(0, 0, 30, 30) btn1.addTarget(self, action: Selector("action1:"), forControlEvents: .TouchUpInside) self.navigationItem.setLeftBarButtonItem(UIBarButtonItem(customView: btn1), animated: true);

Para swift> = 2.2, la acción debe ser #selector(Class.MethodName) ... por ejemplo, btnName.addTarget(self, action: #selector(Class.MethodName), forControlEvents: .TouchUpInside)


func viewDidLoad(){ let homeBtn: UIButton = UIButton(type: UIButtonType.custom) homeBtn.setImage(UIImage(named: "Home.png"), for: []) homeBtn.addTarget(self, action: #selector(homeAction), for: UIControlEvents.touchUpInside) homeBtn.frame = CGRect(x: 0, y: 0, width: 30, height: 30) let homeButton = UIBarButtonItem(customView: homeBtn) let backBtn: UIButton = UIButton(type: UIButtonType.custom) backBtn.setImage(UIImage(named: "back.png"), for: []) backBtn.addTarget(self, action: #selector(backAction), for: UIControlEvents.touchUpInside) backBtn.frame = CGRect(x: -10, y: 0, width: 30, height: 30) let backButton = UIBarButtonItem(customView: backBtn) self.navigationItem.setLeftBarButtonItems([backButton,homeButton], animated: true) } }