¿cómo configurar programáticamente la acción de barButtonItem en swift 3?


Esto es lo que usé anteriormente,

var barButtonItem = UIBarButtonItem(image: backImgs, style: UIBarButtonItemStyle.plain, target: self, action: Selector("menuButtonTapped:"))

Pero hay algunos cambios de sintaxis para Swift 3. Gracias de antemano.

Author: Nirav D, 2016-09-29

10 answers

Ex: -

navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Add", style: .plain, target: self, action: #selector(addTapped))
 66
Author: Tony Vincent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-29 11:10:31

Resuma el método más utilizado en Swift 3 para agregar acción a un barButton.

  1. Barbutton con texto

    navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Add", style: .plain, target: self, action: #selector(addTapped))
    
  2. BarButton con tu propia imagen

    navigationItem.rightBarButtonItem = UIBarButtonItem(image: UIImage(named:"add"), style: .plain, target: self, action: #selector(addTapped))
    
  3. BarButton con imagen del sistema

    navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addTapped))
    
 41
Author: flame3,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-10 14:52:49

Si alguien está usando customView:

barButtonItem.customView?.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(onBarButtonItemClicked)))
 20
Author: Onuray Sahin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-25 16:00:43

Una línea de código en Swift 3 para iOS 10.1:

navigationController?.navigationBar.topItem?.rightBarButtonItem = UIBarButtonItem(title: "Add", style: .plain, target: self, action: nil)
 11
Author: Marco Aurelio Americo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-23 10:12:24

Solo necesita cambiar su sintaxis selector a partir de Swift 3 necesita especificar el primer nombre de parámetro del método en su llamada a la función, así que cambie su selector de esta manera.

#selector(menuButtonTapped(sender:))

Y su método debe ser así.

func menuButtonTapped(sender: UIBarButtonItem) {

}
 9
Author: Nirav D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-29 11:18:46
let barButtonItem = UIBarButtonItem(image: UIImage(named: "backImgs"),
                                            style: .plain,
                                            target: self,
                                            action: #selector(menuButtonTapped))

// Adding button to navigation bar (rightBarButtonItem or leftBarButtonItem)
self.navigationItem.rightBarButtonItem = barButtonItem

 // Private action
@objc fileprivate func menuButtonTapped() { // body method here }
 7
Author: Mihail Salari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-29 11:21:53

Cree una extensión para el elemento barbutton.

 extension UINavigationItem {
    func addSettingButtonOnRight(){
       let button = UIButton(type: .Custom)
       button.setTitle("setting", forState: .Normal)
       button.titleLabel?.font = UIFont.systemFontOfSize(15.0)
       button.layer.cornerRadius = 5
       button.backgroundColor = UIColor.grayColor()
       button.frame = CGRect(x: 0, y: 0, width: 100, height: 25)
       button.addTarget(self, action: #selector(gotSettingPage), forControlEvents: UIControlEvents.TouchUpInside)
       let barButton = UIBarButtonItem(customView: button)

       self.rightBarButtonItem = barButton
   }

   func gotSettingPage(){

   }
 }

Y llámalo desde viewDidLoad ()

 self.navigationItem.addSettingButtonOnRight()
 4
Author: Mr. Tann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-16 06:21:18

En Swift 3 , puedes añadir UIBarButtonItem así,

let addButton = UIBarButtonItem(image:UIImage(named:"your_icon_name"), style:.plain, target:self, action:#selector(YourControllerName.buttonAction(_:)))
addButton.tintColor = UIColor.white
self.navigationItem.rightBarButtonItem = addButton

Y manejar la acción del botón así,

func buttonAction(_ sender: UIBarButtonItem) {

}

Espero que ayude.

 3
Author: Riajur Rahman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-14 08:34:57

Para Swift 4 añadir viewDidLoad:

navigationItem.rightBarButtonItem = UIBarButtonItem(
    barButtonSystemItem: UIBarButtonSystemItem.add, 
    target: self, 
    action: #selector(addTransaction)
)
 3
Author: pankaj nigam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-19 17:05:05

Hacer un UIBarButtonItem:

let rightButton: UIBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.done, target: self, action: #selector(LocationViewController.doneButtonClicked(_:)))

Añadir a navigationItem:

self.navigationItem.rightBarButtonItem = rightButton

Función asociada:

func doneButtonClicked(_ button:UIBarButtonItem!){    
    print("Done clicked")    
}
 1
Author: A.G,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-10 05:00:38