web-dev-qa-db-fra.com

Comment créer par programmation un UIBarButtonitem "Retour" dans Swift?

J'ai pu créer un élément UIBarButton qui peut revenir par programme en utilisant le code suivant:

    func backAction() -> Void {        
        self.navigationController?.popViewControllerAnimated(true)
    }
override func viewDidLoad() {
        super.viewDidLoad()
    let backButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Plain, target: self, action: "backAction")

        self.navigationItem.leftBarButtonItem = backButton
    }

Le problème est que le bouton de retour n'a pas la flèche pointant vers la gauche: enter image description here Existe-t-il un moyen de le faire ressembler à un bouton de retour normal avec la flèche comme ceci: enter image description here

J'aimerais également savoir s'il existe un moyen de faire des noms de titre de bouton le titre du contrôleur de vue précédent, si cela est possible.

Merci

12
Rami Ammoun

Ci-dessous le code en utilisant UIButton avec image, vous pouvez l'ajouter en tant que vue personnalisée pour UIBarButtonItem

override func viewDidLoad() {
    super.viewDidLoad()
    var backbutton = UIButton(type: .Custom)
    backbutton.setImage(UIImage(named: "BackButton.png"), forState: .Normal) // Image can be downloaded from here below link 
    backbutton.setTitle("Back", forState: .Normal)
    backbutton.setTitleColor(backbutton.tintColor, forState: .Normal) // You can change the TitleColor
    backbutton.addTarget(self, action: "backAction", forControlEvents: .TouchUpInside)

    self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: backbutton)
}

func backAction() -> Void {        
   self.navigationController?.popViewControllerAnimated(true)
}

BackButton.png Lien de téléchargement

Pour définir le titre du bouton arrière avec le titre précédent du contrôleur de vue, vous devez passer le titre sous forme de chaîne tout en présentant le contrôleur, modifiez le code ci-dessus comme

var titleStrFromPreviousController: String // This value has to be set from previous controller while presenting modal controller
backbutton.setTitle(titleStrFromPreviousController, forState: .Normal)

Cela peut aider.

Swift 3

override func viewDidLoad() {
    super.viewDidLoad()

    addBackButton()
}

func addBackButton() {
    let backButton = UIButton(type: .custom)
    backButton.setImage(UIImage(named: "BackButton.png"), for: .normal) // Image can be downloaded from here below link
    backButton.setTitle("Back", for: .normal)
    backButton.setTitleColor(backButton.tintColor, for: .normal) // You can change the TitleColor
    backButton.addTarget(self, action: #selector(self.backAction(_:)), for: .touchUpInside)

    self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: backButton)
}

@IBAction func backAction(_ sender: UIButton) {
   let _ = self.navigationController?.popViewController(animated: true)
}
35
silentBeep

Mis à jour pour Swift 4.2 - grâce à sam bing et silentbeep

Apporté quelques modifications sur certaines couleurs et sélecteur d'action.

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = .blue
        self.navigationItem.title = title
        self.navigationController?.navigationBar.barTintColor = .white
        self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: makeBackButton())
    }

    func makeBackButton() -> UIButton {
        let backButtonImage = UIImage(named: "backbutton")?.withRenderingMode(.alwaysTemplate)
        let backButton = UIButton(type: .custom)
        backButton.setImage(backButtonImage, for: .normal)
        backButton.tintColor = .blue
        backButton.setTitle("  Back", for: .normal)
        backButton.setTitleColor(.blue, for: .normal)
        backButton.addTarget(self, action: #selector(self.backButtonPressed), for: .touchUpInside)
        return backButton
    }

    @objc func backButtonPressed() {
        dismiss(animated: true, completion: nil)
//        navigationController?.popViewController(animated: true)
    }
6
Newsonic

Vous pouvez le faire en incorporant votre vue dans un contrôleur de navigation. Voici une image montrant comment faire cela: navigationController

J'espère que cela aide: D

4
Pixele9

La première réponse fonctionne très bien mais l'image est un peu trop grande, utilisez donc l'aperçu et réduisez-la à la largeur: 13 et la hauteur: 22, définissez également son mode de rendu sur .alwaysTemplate et changez la teinte de UIButton en blanc, tout en ajoutant deux espaces avant la chaîne: "Back". Cela se traduira par quelque chose de silencieux similaire au bouton de retour de la barre de navigation, l'image pourrait être meilleure en termes de taille et de placement.

Code édité:

     func addBackButton() {


            let backButtonImage = UIImage(named: "BackButton.png")?.withRenderingMode(.alwaysTemplate)

            let backButton = UIButton(type: .custom)
            backButton.setImage(backButtonImage, for: .normal) 
            backButton.tintColor = .white
            backButton.setTitle("  Back", for: .normal)
            backButton.setTitleColor(.white, for: .normal)
            backButton.addTarget(self, action: #selector(self.backAction(_:)), for: .touchUpInside)

            self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: backButton)


}
1
Sam Bing

J'ai changé une dernière ligne de code de la réponse sélectionnée et cela fonctionne pour moi.

override func viewDidLoad() {
    super.viewDidLoad()

    addBackButton()
}

func addBackButton() {
    let backButton = UIButton(type: .custom)
    backButton.setImage(UIImage(named: "BackButton.png"), for: .normal) // Image can be downloaded from here below link
    backButton.setTitle("Back", for: .normal)
    backButton.setTitleColor(backButton.tintColor, for: .normal) // You can change the TitleColor
    backButton.addTarget(self, action: #selector(self.backAction(_:)), for: .touchUpInside)

    self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: backButton)
}

@IBAction func backAction(_ sender: UIButton) {
   let _ = self.dismiss(animated: true, completion: nil)
}
0
Daehue Kim