web-dev-qa-db-fra.com

UIButton à Swift n'enregistre pas de touches

J'essaie de créer un UIButton en utilisant Swift. Il compile bien et je peux voir mon bouton dans le simulateur, mais quand je clique dessus, rien ne se passe. C'est le code que j'utilise:

let settings = UIButton()
settings.addTarget(self, action: "touchedSet:", forControlEvents: UIControlEvents.TouchUpInside)
settings.setTitle("Settings", forState: .Normal)
settings.frame = CGRectMake(0, 530, 150, 50)
scrollView.addSubview(settings)

Dans la même classe, voici la fonction 'touchedSet':

func touchedSet(sender: UIButton!) {
    println("You tapped the button")
}

J'utilise le simulateur car je n'ai pas d'appareil iOS 8.0, est-ce que cela pourrait être le problème?

Merci!

24
Phillip

Je vois que c’est une vieille question mais j’ai fait face au même problème hier. Mes boutons ont été mis en surbrillance au toucher mais ne déclenchent pas l'action.

J'ai deux contrôleurs de vue. Une vue couvre la vue des autres et le bouton est en vue de dessus.

par exemple.

  • Rootviewcontroller a vue arrière

  • Topviewcontroller a la vue de dessus

Le bouton en vue de dessus n'appelle pas l'action si je n'ajoute pas le topviewcontroler en tant que childviewcontroller du rootviewcontroller. Après avoir ajouté topviewcontroller en tant que childviewcontroller, il a commencé à fonctionner.

Donc, en bref: essayez simplement d’ajouter le contrôleur de vue de boutons superview en tant que childviewcontroller au vue parent viewcontroller avec la méthode suivante

func addChildViewController(_ childController: UIViewController)
15
Mert

Les sélecteurs sont une structure qui doit être créée.

Faites-le comme ça ...

Mis à jour pour Swift 4

settingsButton.addTarget(self, action: #selector(showSettings), for: .touchUpInside)

Ça devrait le faire.

8
Fogmeister

Pour ceux qui sont également bloqués dans le tutoriel:

J'ai rencontré le même problème lorsque je suivais le guide «Démarrer le développement d'applications iOS (Swift)». Il s’est avéré que j’avais supervisé ces lignes de code dans le tutoriel

override var intrinsicContentSize : CGSize {
    return CGSize(width: 240, height: 44)
}

Les ajouter à mon RatingControl a résolu le problème.

5
ouven

Dans le simulateur, parfois, il ne reconnaît pas le sélecteur. Il semble y avoir un bug. Je viens de changer le nom de l'action (sélecteur) et cela a fonctionné.

let buttonPuzzle:UIButton = UIButton(frame: CGRectMake(100, 400, 100, 50))
buttonPuzzle.backgroundColor = UIColor.greenColor()
buttonPuzzle.setTitle("Puzzle", forState: UIControlState.Normal)
buttonPuzzle.addTarget(self, action: "buttonAction:", forControlEvents: UIControlEvents.TouchUpInside)
buttonPuzzle.tag = 22;
self.view.addSubview(buttonPuzzle)

La fonction de sélection est ici:

func buttonAction(sender:UIButton!)
{
    var btnsendtag:UIButton = sender
    if btnsendtag.tag == 22 {
        //println("Button tapped tag 22")
    }   
}
5
user1671097

J'ai eu un problème similaire quand j'avais un subViewController avec des boutons et des tapHandlers à faire correspondre, et je voulais le placer sur une pile dans un superViewController séparé ..

Cela n'a provoqué aucun déclencheur tapHandlers, et la solution consistait à ne pas utiliser addArrangedSubview (subViewController.view), mais également addChildViewController(subViewController) dans la vue d'ensemble pour permettre à l'enfantViewController de continuer à fonctionner comme viewController et pas seulement comme vue.

3
Lord Fresh

Je ne vois qu'un seul problème: vous devez définir la action avec Selector comme suit:

settings.addTarget(self, action: Selector("touchedSet:"), forControlEvents: UIControlEvents.TouchUpInside)

N'oubliez pas d'insérer : si vous devez transmettre des paramètres à la fonction.

1
Tchelow

J'ai eu ce problème lorsque la vue parent de mon bouton a isUserInteractionEnabled == false. Toutes les sous-vues auront la même userInteraction que leur vue parent. Donc, je viens d'ajouter cette ligne parentView.isUserInteractionEnabled = true et le problème a disparu. J'espère que ça aide quelqu'un.

1
Bohdan Savych

J'ai trouvé un exemple similaire pour Swift 2 et adapté pour Swift 3. Testé, il fonctionne très bien. J'espère que ça aide.

// http://lab.dejaworks.com/ios-Swift-3-playground-uibutton-action
// Trevor D. Beydag

import UIKit
import PlaygroundSupport
class Responder : NSObject {
    func action() {
        print("Button pressed!")
    }
}

let containerView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 300.0,    height: 600.0))
PlaygroundPage.current.liveView = containerView
let responder = Responder()

let button = UIButton(frame: CGRect(x: 0, y: 0, width: 50, height: 50))
button.backgroundColor = UIColor.green
button.setTitle("TEST", for: .normal)
button.addTarget(responder, action: #selector(Responder.action), for: .touchUpInside)
containerView.addSubview(button)
0
Trevor

Donc, vous devriez utiliser la ligne suivante

settings.userInteractionEnabled = true
0
Samrez Ikram

Le problème avec ce tutoriel d'Apple est la façon dont ils ont placé UIView (RatingControl) dans StackView, ce qui est incorrect. UIView (RatingControl) doit être en dehors de StackView. Donc, la solution est: 1. Faites glisser UIView (RatingControl) en dehors de StackView 2. Définissez les contraintes pour la nouvelle position du RatingControl - La marge avant du conteneur est égale à zéro - La marge arrière du conteneur est égale à zéro - La marge supérieure de StackView est égale à zéro

Avec ces nouvelles contraintes, RatingControl aura désormais le même contenu que Container, quelle que soit la taille de l'écran du périphérique, et sera toujours juste derrière StackView où le sélecteur de photo apparaîtra.

J'espère que cela vous aidera les gars.

0

Assurez-vous de lier votre bouton à votre variable d'instance IBOutlet dans votre code si vous utilisez le storyboard.

0
Peng90

Vous avez dit dans la même classe. Assurez-vous que le code du bouton lui-même est dans le viewDidLoad () et que l'action est en dehors de celui-ci, mais à l'intérieur de la classe si vous travaillez avec une vue.

0
elito25

J'avais le même problème lors de l'implémentation d'UIButton et de SearchBar sur la vue conteneur (UIView) . Dans mon cas, la cause était le problème de contrainte. La contrainte sur la barre de recherche avait un problème et, par conséquent, l'ensemble de fonctions n'avait jamais été appelé.

Vous pouvez voir s'il y en a un depuis le bouton "Hiérarchie de la vue de débogage". (le problème de contrainte est indiqué par un avertissement violet)

(env: iOS12, xcode10.1)

0
simotunes

Ancienne question, mais je pensais aider les autres à la recherche de ce problème. Tout d'abord, je ne suis pas tout à fait sûr que cela soit exact, alors corrigez-moi si je me trompe.

Mais si vous définissez le sélecteur à tort, l'application se bloquera lorsque vous appuierez sur le bouton, car elle est abonnée à un sélecteur qui n'existe pas. Ce qui signifie que votre sélecteur fonctionne. Je suppose que quelque chose d'autre bloque l'événement tactile, en supposant que UIButton.enabled = true et UIButton.userInteractionEnabled = true. Habituellement, vous pouvez vérifier cela en appuyant longuement sur le bouton et voir si cela se produit. Si c'est le cas, vous ajoutez alors une UIGestureRecognizer qui occupe en premier lieu les occurrences. Peut-être aussi la UIScrollView qui retarde la saisie tactile (il y a une case à cocher pour cela dans l'inspecteur).

J'espère que cela aide quelqu'un, et j'espère que c'est exact.

0
ClockWise