UIBarButtonItem dans la barre de navigation par programmation?

135

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 l'image "stop". Juste comme ça, il existe d'autres solutions avec "recherche," rafraîchissement "etc. Mais que faire si je veux ajouter un bouton par programmation avec l'image que je veux?

Rahul Sonvane
la source

Réponses:

343

Image du bouton personnalisé sans cadre de bouton de réglage:

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 ce document Apple. référence


UIBarButtonItem avec une image de bouton personnalisée utilisant un cadre de bouton

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

FOR Swift 2.0et plus

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 plus de 1 éléments, utilisez rightBarButtonItemsou pour le côté gaucheleftBarButtonItems

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]

Utiliser setLeftBarButtonItemousetRightBarButtonItem

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 devrait être #selector(Class.MethodName)... par exemplebtnName.addTarget(self, action: #selector(Class.MethodName), forControlEvents: .TouchUpInside)

Capitaine EI v2.0
la source
Très bonne réponse. Je tiens juste à souligner que la méthode Selector a été mise à jour pourlet camera = UIBarButtonItem(barButtonSystemItem: .Camera, target: self, action: #selector(Class.MethodName))
CodeBender
J'ai trouvé que si vous voulez que votre bouton inclue également le texte, vous devez spécifier la partie CGRect. Il y a quelques exemples flottant autour de SO qui ne le spécifient pas.
Micah Montoya
merci pour votre réponse parfaite. Ce n'est pas mal d'ajouter une mise à jour pour swift 4.
Milad Faridnia
38

C'est beaucoup plus facile avec Swift 4ouSwift 4.2

dans votre ViewDidLoadméthode, 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 dans le paramètre d'action comme ci-dessous

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

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

Jay Mayu
la source
17

Simplement configurer UIBarButtonItemavec customView

Par exemple:

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

ou utilisez setFunction:

  self.navigationItem.setLeftBarButtonItem(UIBarButtonItem(customView: yourButton), animated: true);
Leo
la source
1
Je vote votre réponse car votre code fonctionne également, mais le code de Bhavin est une solution unique, alors j'accepterai sa réponse. Merci pour votre contribution mate :)
Rahul Sonvane
11

Je viens de tomber 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

C'est certainement beaucoup plus rapide que de créer l'UIButton avec toutes les propriétés, puis d'ajouter ensuite le customView à UIBarButtonItem.

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

test.tintColor = UIColor.white()

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

tech4242
la source
7

Dans Swift 3.0+, UIBarButtonItemconfigurez-le par programme comme suit:

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

   @objc func clickButton(){
            print("button click")
     }
Kushal Shrestha
la source
3

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
Sudhi 9135
la source
2

J'ai le même problème et j'ai lu les réponses dans un autre sujet, puis je résous une autre manière similaire. Je ne sais pas ce qui 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 );
}
AngelThread
la source
1

C'est une chose folle de pomme. Lorsque vous dites self.navigationItem.rightBarButtonItem.title, il dira nil alors que sur l'interface graphique, il affiche Modifier ou Enregistrer. Fresher likes me prendra beaucoup de temps pour déboguer ce comportement.

Il est nécessaire que l'élément affiche Modifier dans le premier chargement, puis l'utilisateur appuie dessus.Il passera à 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 deviendra 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)
}

// appuyez sur Enregistrer l'élément 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)

}
codeurs
la source
1

iOS 11

Définition d'un bouton personnalisé à l'aide d'une contrainte:

let buttonWidth = CGFloat(30)
let buttonHeight = CGFloat(30)

let button = UIButton(type: .custom)
button.setImage(UIImage(named: "img name"), for: .normal)
button.addTarget(self, action: #selector(buttonTapped(sender:)), for: .touchUpInside)
button.widthAnchor.constraint(equalToConstant: buttonWidth).isActive = true
button.heightAnchor.constraint(equalToConstant: buttonHeight).isActive = true

self.navigationItem.rightBarButtonItem = UIBarButtonItem.init(customView: button)
Achyut Sagar
la source
0
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)
}

}
Sai kumar Reddy
la source