J'aimerais que le titre navigationbar
soit cliquable. Lorsque l'utilisateur clique dessus, il devrait effectuer une transition. Mais je ne sais pas comment faire ça.
J'ai essayé ce qui suit pour obtenir le titre et lui appliquer le geste de toucher.
var subviews = self.navigationController?.navigationBar.subviews
if let subviews = subviews {
// Better check for array length before accessing to the 1st element
var subview = subviews [0]
}
mais sa me donne l'erreur Variable subview inferred to have type AvyObject, which may be unexpected
Une autre approche consiste à ajouter un bouton comme titre du contrôleur de navigation.
Vous devez définir la vue titre de l'élément de navigation sur votre objet bouton.
Créer un objet bouton dans la méthode viewDidLoad()
:
Swift 4.0 Edit
let button = UIButton(type: .custom)
button.frame = CGRect(x: 0, y: 0, width: 100, height: 40)
button.backgroundColor = .red
button.setTitle("Button", for: .normal)
button.addTarget(self, action: #selector(clickOnButton), for: .touchUpInside)
navigationItem.titleView = button
Ici, vous pouvez voir que dans la dernière ligne, le bouton est directement défini sur la variable titleView
de navigationItem
qui ajoutera un bouton au centre de la barre de navigation.
La méthode d'action pour le bouton est ci-dessous:
@objc func clickOnButton() {
}
Réponse de Kampai mise à jour pour Swift 3:
let button = UIButton(type: .custom)
button.frame = CGRect(x: 0, y: 0, width: 100, height: 40)
button.setTitle("Button", for: .normal)
button.addTarget(self, action: #selector(self.clickOnButton), for: .touchUpInside)
self.navigationItem.titleView = button
Pour vous débarrasser de cette erreur, spécifiez un type pour votre constante if let
. Je vous recommanderais également de changer ce nom de constante if let
puisqu'il est identique à celui déjà déclaré à la ligne précédente.
var subviews = self.navigationController?.navigationBar.subviews
if let subviewArray:NSArray = subviews {
// Better check for array length before accessing to the 1st element
var subview:UILabel = subviewArray[0] // <-- If the subview's a UILabel
}