web-dev-qa-db-fra.com

Coincé avec l'ajout de cible au bouton dans Swift 3 par programmation

J'ai créé un UIButton avec Swift 3 et je veux qu'il imprime un message lorsqu'il est pressé. 

J'ai donc fait quelque chose comme ceci: Dans loadView ()

button.addTarget(self, action: #selector(ViewController.pressButton(button:)), for: .touchUpInside)

Une méthode: 

func pressButton(button: UIButton) {

    NSLog("pressed!")

}

Mais rien ne se passe lorsque je clique sur le bouton. 

15
user234159

Ajoutez le code du bouton dans votre viewDidLoad et cela fonctionnera pour vous:

override func viewDidLoad() {
    super.viewDidLoad()
    let button = UIButton(frame: CGRect(x: 10, y: 10, width: 100, height: 100))
    button.backgroundColor = UIColor.gray
    button.addTarget(self, action: #selector(pressButton(button:)), for: .touchUpInside)
    self.view.addSubview(button)
}

func pressButton(button: UIButton) {
    NSLog("pressed!")
}

Vous n’avez pas besoin d’ajouter ViewController.pressButton à selector, c’est suffisant avec le function name.

Version Swift 4.x:

let button = UIButton(frame: CGRect(x: 10, y: 10, width: 100, height: 100))
button.backgroundColor = .gray
button.tag = 0
button.addTarget(self, action: #selector(pressButton(_:)), for: .touchUpInside)
self.view.addSubview(button)

@objc func pressButton(_ button: UIButton) {
    print("Button with tag: \(button.tag) clicked!")
}
26
Rashwan L

essayez ceci dans Swift3!

button.addTarget(self, action: #selector(self.pressButton(button:)), for: .touchUpInside)

@objc func pressButton(button: UIButton) { NSLog("pressed!") }
6
Otis Lee

Utilisez le code suivant.

button.addTarget(self, action: #selector(FirstViewController.cartButtonHandler), for: .touchUpInside)

Le nom de votre classe correspond à FirstViewController

Et votre sélecteur correspond à la fonction suivante

func cartButtonHandler() {

}
5
arango_86

Dans Swift 3, utilisez ceci -

object?.addTarget(objectWhichHasMethod, action: #selector(classWhichHasMethod.yourMethod), for: someUIControlEvents)

Par exemple (de mon code) -

self.datePicker?.addTarget(self, action:#selector(InfoTableViewCell.datePickerValueChanged), for: .valueChanged)

Donnez simplement un : après le nom de la méthode si vous voulez que l'expéditeur soit un paramètre.

3
Nikhil Manapure
 let cancelButton = UIButton.init(frame: CGRect(x: popUpView.frame.size.width/2, y: popUpView.frame.size.height-20, width: 30, height: 30))
        cancelButton.backgroundColor = UIColor.init(patternImage: UIImage(named: cancelImage)!)
        cancelButton.addTarget(self, action: #selector(CommentsViewController.canceled), for:.touchUpInside)
0
Divya Rayapati

Vous mentionnez que l'appel addTarget est dans loadView(). Est-ce que cela se trouve dans votre sous-vue personnalisée ou dans le viewController? 

Depuis votre sélecteur, il cible une méthode de votre classe ViewController, mais si target pour cette action correspond à la vue elle-même, il serait alors logique que l'action ne se déroule pas. 

Si vous déclarez votre bouton dans un viewController et que vous ajoutez la cible viewDidLoad comme ci-dessus, le message doit alors être imprimé comme vous le souhaitez. Je crois que vous "ciblez" la mauvaise classe avec votre action.

0
BHendricks
  1. Ajouter le code du bouton dans la méthode override func viewDidLoad()
  2. Assurez-vous que votre gestionnaire d'actions est identifié avec @IBAction comme ceci:

    @IBAction func pressButton (bouton: UIButton) { print ("appuyé!") }

Alors ça va marcher!

0
SpkingR