Partage
  • Partager sur Facebook
  • Partager sur Twitter

fonction @objc avec paramètre en Swift sur IOS.

    8 février 2019 à 18:50:02

    Bonjour,

    J'aimerais bien connecter un bouton à une action, donc à une fonction @objc mais en lui passant un paramètre.

    J'ai donc une fonctions qui vas créé un bouton 

    func addPrest(_ yAdd: CGFloat, _ num: Int){
            let tiers = container.frame.width / 3
            let hauteur: CGFloat = 50
            let taille = CGSize(width: tiers, height: hauteur)
            let y: CGFloat = 10
            let yEnd: CGFloat = yAdd*1.8
            let bouton = UIButton()
            bouton.frame.size = taille
            bouton.center = CGPoint(x: 0 + tiers, y: y * yEnd)
            bouton.addTarget(self, action: #selector(buttonAction(1)), for: .touchUpInside)
            bouton.setTitle("bouton1", for: UIControl.State.normal)
            bouton.setTitleColor(UIColor.darkGray, for: .normal)
            container.addSubview(bouton)
            
        }

    et une action

    @objc func supp(_ index: Int){
            print("supp + \(index)")
        }

    Le problème est donc que lorsque j'écrit ce code, xCode me retourne:

    "Argument of '#selector' does not refer to an '@objc' method, property, or initializer"

    Sauriez-vous donc comment m'aider?

    Merci à vous


    -
    Edité par elwe_2808 8 février 2019 à 18:50:46

    • Partager sur Facebook
    • Partager sur Twitter
      8 février 2019 à 23:46:41

      Salut, c’est triste à dire mais le seul paramètre que peut prendre l’action d’un bouton c’est un UIButton. Tu peux toujours mettre un tag à ton bouton et récupérer Ce tag dans la méthode.
      • Partager sur Facebook
      • Partager sur Twitter
        9 février 2019 à 0:02:02

        Merci!

        J'ai tenter de faire comme ceci:

        override func viewDidLoad() {
                super.viewDidLoad()
                addPrest(1)
                addPrest(2)
                addPrest(3)
                addPrest(4)
                addPrest(5)
            }
        
            func addPrest(_ yAdd: CGFloat){
                let tiers = container.frame.width / 3
                let hauteur: CGFloat = 50
                let taille = CGSize(width: tiers, height: hauteur)
                let y: CGFloat = 10
                let yEnd: CGFloat = yAdd*1.8
                let bouton = UIButton()
                bouton.frame.size = taille
                bouton.center = CGPoint(x: 0 + tiers, y: y * yEnd)
                
                
                bouton.tag = Int(yAdd)
                bouton.addTarget(self, action: #selector(supp), for: .touchUpInside)
                
                bouton.setTitle("bouton \(Int(yAdd))", for: UIControl.State.normal)
                bouton.setTitleColor(UIColor.darkGray, for: .normal)
                container.addSubview(bouton)
                
            }
            
            
            @objc func supp(_ sender: UIButton){
                let index = sender.tag
                print("supp + \(index)")
            }

        Mais ceci me retourne des valeurs étrange, lorsque je clique sur

        le bouton(1), il me print 2

        Le bouton(2), il me print 3, ensuite pour le 3 il me print(4), pour le 4, 5 et enfin pour le 5 il me print(5).

        C'est comme si toutes les valeurs étais incrémenter ou bien qu'il se servais du tag du précédent bouton, cela dit il n'y a pas de précédent bouton au bouton 1. Je ne comprend pas?

        -
        Edité par elwe_2808 9 février 2019 à 0:34:46

        • Partager sur Facebook
        • Partager sur Twitter
          9 février 2019 à 9:39:35

          A mon avis c'est la fatigue.

          Tu fais :

          addPrest(1)
          addPrest(2)
          addPrest(3)
          addPrest(4)
          addPrest(5)

          On est d'accord que là tu ajoutes 5 boutons en passant 5 Float différent ?

          Ensuite tu fais : 

          bouton.tag = Int(yAdd)

          On est toujours d'accord que là tu set le tag avec la valeur passé en paramètre (donc 1, 2, 3, 4, 5 selon le bouton)

           Puis tu fais 

          let index = sender.tag
          print("supp + \(index)")

          Donc effectivement, ton 3è bouton a le tag 3 et ça affiche "supp + 3). Tout est normal. Remplace addPrest(3) par addPrest(8) et ça t'affichera 8.

          • Partager sur Facebook
          • Partager sur Twitter
            9 février 2019 à 11:59:10

            Merci, j'ai recréé un projet en appliquant cela et étrangement ça fonctionne, alors que dans l'autre impossible, j'ai probablement du faire une erreur. Enfin ce qui compte c'est que ça fonctionne. Merci!

            -
            Edité par elwe_2808 9 février 2019 à 18:42:25

            • Partager sur Facebook
            • Partager sur Twitter

            fonction @objc avec paramètre en Swift sur IOS.

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown