addTarget et selector dans la création d'un UIButton

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  !!!!!!!!!!!
    } 

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.

Connectez-vous ou Inscrivez-vous pour répondre.