web-dev-qa-db-fra.com

UIBarButtonItem dans la barre de navigation par programme?

Je cherche cette solution depuis un moment, mais je n'en ai pas. par exemple une solution est

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

Ce code ajoutera un bouton avec "stop" image. Juste comme cela, il existe d'autres solutions avec "recherche," actualiser "etc. Mais si je veux ajouter un bouton par programme avec l'image que je veux?

112
Rahul Sonvane

Image du bouton personnalisé sans paramétrage du bouton:

Vous pouvez utiliser init(image: UIImage?, style: UIBarButtonItemStyle, target: Any?, action: Selector?) pour initialiser un nouvel élément à l'aide de l'image spécifiée et d'autres propriétés.

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

Vérifiez ceci référence Apple Doc.


UIBarButtonItem avec une image de bouton personnalisée à l'aide du cadre de bouton

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

POUR Swift 2.0 et plus ancien

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

Ou utilisez simplement init (customView:) comme

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

Pour le système UIBarButtonItem

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

Pour définir plusieurs éléments, utilisez rightBarButtonItems ou pour le côté gauche 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]

Utilisation de setLeftBarButtonItem ou 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);

Pour Swift> = 2.2, l'action doit être #selector(Class.MethodName) ... par exemple. btnName.addTarget(self, action: #selector(Class.MethodName), forControlEvents: .TouchUpInside)

311
EI Captain v2.0

C'est beaucoup plus facile avec Swift 4 ou Swift 4.2

dans votre méthode ViewDidLoad, définissez votre bouton et ajoutez-le à la barre de navigation.

override func viewDidLoad() {
    super.viewDidLoad()

    let logoutBarButtonItem = UIBarButtonItem(title: "Logout", style: .done, target: self, action: #selector(logoutUser))
    self.navigationItem.rightBarButtonItem  = logoutBarButtonItem

}

alors vous devez définir la fonction que vous avez mentionnée à l'intérieur du paramètre d'action comme ci-dessous

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

Vous devez ajouter le préfixe @objc car il utilise toujours les éléments hérités (Objective C).

23
Jay Mayu

Il suffit de configurer UIBarButtonItem avec customView

Par exemple:

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

ou utilisez setFunction:

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

Je suis tombé par hasard sur cette question et voici une mise à jour pour Swift 3 et iOS 10:

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

Il est nettement plus rapide que de créer le UIButton avec toutes les propriétés, puis d’ajouter ensuite le customView au UIBarButtonItem.

Et si vous souhaitez modifier la couleur de l'image, du bleu par défaut, par exemple à blanc, vous pouvez toujours changer la couleur de teinte:

test.tintColor = UIColor.white()

PS Vous devez évidemment changer de sélecteur, etc. pour votre application :)

11
tech4242

Dans Swift 3 pour une action dans le bouton de la barre:

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")
    }
6
Kushal Shrestha

Définition de LeftBarButton avec l'image d'origine.

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

J'ai le même problème et j'ai lu les réponses sur un autre sujet, puis je résous d'une autre manière similaire. Je ne sais pas lequel est le plus efficace. problème similaire

//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 );
}
2
AngelThread

C'est une chose folle d'Apple. Lorsque vous dites self.navigationItem.rightBarButtonItem.title, le message nil est affiché alors que l'interface graphique affiche Edit ou Save. Il me faudra beaucoup de temps pour que ce problème soit corrigé par Fresher.

Il est nécessaire que l'élément affiche Edit dans la première charge, puis l'utilisateur appuie dessus. Il devient alors Enregistrer le titre. Pour archiver cela, j'ai fait comme ci-dessous.

// la vue a été chargée dira Modifier le titre

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

// appuyez sur Modifier l'élément passera à Enregistrer le titre

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

// tapez sur Enregistrer l'article affichera Modifier le titre

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

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

}
0
Sai kumar Reddy