addTarget et selector dans la création d'un UIButton
fleurantin
Membre
Bonjour à tous,
Je me bats depuis 2 heures avec un problème pourtant évident à résoudre sur Objective-C.
En réponse à des taps longs issu d'un UILongPressGestureRecognizer sur une UIImageView je crée des boutons auquels j'affecte un Target et une action.
Mais quand je clique sur un bouton (simulateur) je n'ai pas d'appel à ma fonction.
Une idée.
Voici mon code
import UIKit
import CoreData
class ConteneurViewController: UIViewController, UIGestureRecognizerDelegate {
@IBOutlet var photo: UIImageView!
@IBOutlet var nomConteneur: UITextField!
var managedObjectContext: NSManagedObjectContext? = nil
var monConteneur : Conteneur?
func configureView() {
if nomConteneur != nil {
self.nomConteneur.text = monConteneur?.nom
}
}
override func viewDidLoad() {
super.viewDidLoad()
configureView()
let gestureRecognizer = UILongPressGestureRecognizer(target: self, action:#selector(tapView(_:)))
self.photo.addGestureRecognizer(gestureRecognizer)
let context = self.managedObjectContext!
self.monConteneur = Conteneur(context: context)
}
@objc
@IBAction func tapView(_ sender: UIGestureRecognizer) {
if sender.state == UIGestureRecognizer.State.ended {
let lieu = sender.location(in: self.photo)
let nbrCasiers = (self.monConteneur?.casiers_Conteneur?.count ?? 0)
let context = self.managedObjectContext!
let newCasier = Casier(context: context)
let nomCasier = String.init(format: "Casier %i", 1 + nbrCasiers)
newCasier.nom_Casier = nomCasier
let taillePhoto = self.photo.frame.size
newCasier.x_surPhoto = Float(lieu.x)/Float(taillePhoto.width)
newCasier.y_surPhoto = Float(lieu.y)/Float(taillePhoto.height)
self.monConteneur?.addToCasiers_Conteneur(newCasier)
// Création d'un bouton
let unBouton = UIButton.init(type: .system)
unBouton.tag = 1+nbrCasiers
unBouton.isEnabled = true
let font = UIFont.systemFont(ofSize: 17)
let attributes: [NSAttributedString.Key: Any] = [.font: font, .foregroundColor: UIColor.red]
let attributedQuote = NSAttributedString(string: nomCasier, attributes: attributes)
unBouton.setAttributedTitle(attributedQuote, for: .normal)
unBouton.setTitleColor(UIColor.red, for: .normal)
unBouton.frame.origin.x = lieu.x-unBouton.frame.size.width/2
unBouton.frame.origin.y = lieu.y-unBouton.frame.size.height/2
self.photo.addSubview(unBouton) // insertion sur mon UIImageView
unBouton.addTarget(self, action: #selector(tapBouton(_:)), for: .touchUpInside) // ajout d'une action au bouton
}
}
@objc
func tapBouton(_ sender: UIButton) {
print(sender.tag) // ne passe jamais ici !!!!!!!!!!!
}
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Après vérification même problème sur mon iPhone.
Peut-être une interférence avec le UILongPressGestureRecognizer qui parasiterait la détection d'un tap sur les boutons !
Trouvé une parade !
Fonctionne si je crée le IBButton avec UIButton.systemButton et j'en modifie l'aspect ensuite.
Allez savoir pourquoi !
Les interactions utilisateurs sont désactivées pour les
UIImageView
(et donc leurs subviews). Pour vérifier ce point, c'est la propriétéisUserInteractionEnabled
si tu le fais par code, ou bien il y a une case à cocher dans Xcode.