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?
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.
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)
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).
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);
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 :)
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")
}
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
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 );
}
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)
}
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)
}
}