196 votes

Comment simuler de manière programmatique un événement tactile pour un bouton UIB ?

Je suis en train d'écrire des tests unitaires et, en raison de la nature de cette application particulière, il est important que j'arrive aussi haut que possible dans la hiérarchie des tests. UI chaîne que possible. Ce que je voudrais faire, c'est déclencher par programmation une pression sur un bouton, comme si l'utilisateur avait appuyé sur le bouton dans la fenêtre de l'utilisateur. GUI .

(Oui, oui je podría il suffit d'appeler le IBAction mais, encore une fois, la nature de cette application particulière fait qu'il est important que je simule l'appui réel sur le bouton, de telle sorte que le IBAction être appelé à partir du bouton, lui-même).

Quelle est la méthode préférée pour ce faire ?

0 votes

Pourriez-vous expliquer pourquoi il est important de simuler le toucher du bouton plutôt que d'appeler directement la méthode d'action ? Il n'y a pas vraiment de différence pratique.

1 votes

@Jasarien : bien, parce qu'il y a une différence ! ;) Dans mon application, plusieurs boutons utilisent la même méthode d'action, et la méthode analyse comment se comporter en fonction de la balise du bouton. Donc le test unitaire, en plus de tester un chemin de code particulier à travers la méthode, (a) doit les tester tous et (b) vérifie également que les boutons sont correctement câblés. De plus, cela permet de bien abstraire ma suite de tests unitaires, car je peux définir les tests unitaires comme des lignes dans un fichier texte avec quelque chose comme ceci : "1 + 2 = 3" où "3" est l'affichage final attendu, et tout ce qui précède est le bouton à presser.

0 votes

Votre méthode d'action n'a-t-elle pas un paramètre (id)sender ? Ne pourriez-vous pas simplement appeler la méthode et passer le bouton comme expéditeur ?

5voto

Hitesh Savaliya Points 458

Dans ce cas, UIButton est dérivé de UIControl . Cela fonctionne pour les objets dérivés de UIControl .

Je voulais réutiliser " UIBarButtonItem L'action de "l'action" sur le cas d'utilisation spécifique. Ici, UIBarButtonItem n'offre pas de méthode sendActionsForControlEvents:

Mais heureusement, UIBarButtonItem a des propriétés pour la cible et l'action.

 if(notHappy){        
         SEL exit = self.navigationItem.rightBarButtonItem.action;
         id  world = self.navigationItem.rightBarButtonItem.target;
         [world performSelector:exit];
 }

Ici, rightBarButtonItem est de type UIBarButtonItem .

0 votes

Si vous utilisez UIBarButtonItem, vous pouvez simplement [self doAction:self.navigationItem.rightBarButtonItem] ; //-doAction : est le nom de l'action de basculement de self.navigationItem.rightBarButtonItem.

3voto

Naishta Points 5026

Swift 5 :

class ViewController: UIViewController {
    @IBOutlet weak var theTextfield: UITextField!
    @IBOutlet weak var someButton: UIButton!
    override func viewDidLoad() {
        super.viewDidLoad()
        theTextfield.text = "Pwd"
        someButton.sendActions(for: .touchUpInside)
    }

    @IBAction func someButtonTap(_ sender: UIButton) {
        print("button tapped")
    }
}

2voto

Vive Points 562

C'est pratique pour les personnes qui écrivent des tests unitaires sans tests UI ;-)

Swift 5 pour le résoudre UIBarButtonItem qui n'a pas sendAction comme UIButton, etc.

extension UIBarButtonItem {
    func sendAction() {
        guard let myTarget = target else { return }
        guard let myAction = action else { return }
        let control: UIControl = UIControl()
        control.sendAction(myAction, to: myTarget, for: nil)
    }
}

Et maintenant, vous pouvez simplement :

let action = UIBarButtonItem(title: "title", style: .done, target: self, action: #selector(doSomething))
action.sendAction()

-4voto

elemento Points 246

Swift 4 :

self .yourButton(self)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X