269 votes

Comment créer un bouton de manière programmatique ?

Comment puis-je créer par programmation des éléments graphiques (comme une UIButton ) en Swift ? J'ai essayé de créer et d'ajouter un bouton dans une vue, mais je n'y suis pas parvenu.

437voto

Anil Points 13977

Voici une solution complète pour ajouter un UIButton de manière programmatique avec le Action cible .
Swift 2.2

override func viewDidLoad() {
  super.viewDidLoad()

  let button = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 50))
  button.backgroundColor = .greenColor()
  button.setTitle("Test Button", forState: .Normal)
  button.addTarget(self, action: #selector(buttonAction), forControlEvents: .TouchUpInside)

  self.view.addSubview(button)
}

func buttonAction(sender: UIButton!) {
  print("Button tapped")
}

Il est probablement préférable d'utiliser NSLayoutConstraint plutôt que frame pour placer correctement le bouton pour chaque écran d'iPhone.

Mise à jour du code pour Swift 3.1 :

override func viewDidLoad() {
  super.viewDidLoad()

  let button = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 50))
  button.backgroundColor = .green
  button.setTitle("Test Button", for: .normal)
  button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)

  self.view.addSubview(button)
}

func buttonAction(sender: UIButton!) {
  print("Button tapped")
}

Mise à jour du code pour Swift 4.2 :

override func viewDidLoad() {
  super.viewDidLoad()

  let button = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 50))
  button.backgroundColor = .green
  button.setTitle("Test Button", for: .normal)
  button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)

  self.view.addSubview(button)
}

@objc func buttonAction(sender: UIButton!) {
  print("Button tapped")
}

Ce qui précède fonctionne toujours si func buttonAction est déclaré private o internal .

3 votes

Et n'oubliez pas que votre classe cible doit être dérivée de NSObject

7 votes

Et n'oubliez pas que la fonction qui est votre action ne peut pas être privée.

2 votes

C'est bizarre qu'ils aient décidé de faire une action avec une chaîne de caractères au lieu d'utiliser une fonction (avec les chaînes de caractères, c'est encore plus dangereux que les sélecteurs !) La rétrocompatibilité avec Obj-C probablement :(

103voto

Akhtar Points 325

Vous pouvez ajouter UIButton, UIlable et UITextfield de manière programmatique de cette façon.

Code UIButton

// var button   = UIButton.buttonWithType(UIButtonType.System) as UIButton
let button = UIButton(type: .System) // let preferred over var here
button.frame = CGRectMake(100, 100, 100, 50)
button.backgroundColor = UIColor.greenColor()
button.setTitle("Button", forState: UIControlState.Normal)
button.addTarget(self, action: "Action:", forControlEvents: UIControlEvents.TouchUpInside)
self.view.addSubview(button)

Code UILabel

var label: UILabel = UILabel()
label.frame = CGRectMake(50, 50, 200, 21)
label.backgroundColor = UIColor.blackColor()
label.textColor = UIColor.whiteColor()
label.textAlignment = NSTextAlignment.Center
label.text = "test label"
self.view.addSubview(label)

Code UITextField

var txtField: UITextField = UITextField()
txtField.frame = CGRectMake(50, 70, 200, 30)
txtField.backgroundColor = UIColor.grayColor()
self.view.addSubview(txtField)

J'espère que cela vous sera utile.

0 votes

Alors, pourquoi avez-vous besoin de l'opérateur "as" dans la première ligne de code que vous avez partagée avant UIButton... ?

0 votes

ButtonWithType renvoie le type AnyObject, vous devez donc le convertir en UIButton.

1 votes

@ElgsQianChen Vous pouvez utiliser ce code en fonction de vos besoins. Par exemple, vous voulez ajouter un UIButton lorsque la vue apparaît, vous ajoutez le code dans viewWillAppear.

14voto

Cezary Wojcik Points 2886

L'API n'a pas changé, seule la syntaxe a changé. Vous pouvez créer un UIButton et l'ajouter comme ceci :

var button = UIButton(frame: CGRectMake(0, 0, 50, 50))
self.view.addSubview(button) // assuming you're in a view controller

8voto

Dharmbir Choudhary Points 5689

Vous pouvez créer comme ceci et vous pouvez ajouter une action aussi comme ceci....

import UIKit

let myButton = UIButton(frame: CGRect(x: 0, y: 0, width: 50, height: 50))

init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!)
{       super.init(nibName: nibName, bundle: nibBundle) 
        myButton.targetForAction("tappedButton:", withSender: self)
}

func tappedButton(sender: UIButton!)
{ 
     println("tapped button")
}

0 votes

Désolé, mais le compilateur a envoyé une erreur à la ligne - self.view.addSubview(view : myButton). L'erreur est la suivante : "Label d'argument étranger 'view:' dans l'appel"

0 votes

Veuillez supprimer cette ligne self.view.addSubview(view : myButton) Pour plus d'informations, voir ma réponse éditée.

0 votes

Merci, mais comment puis-je ajouter ce bouton sur self.view ?

3voto

Alex MGD Points 412

Pour créer UIButton à partir du storyboard : 1 - Faites glisser l'objet UIButton de la bibliothèque d'objets vers ViewController dans le fichier du storyboard. 2 - Affichez l'éditeur Assistant 3 - Faites glisser avec un clic droit l'objet UIButton créé ci-dessus dans votre classe. Le résultat est le suivant :

@IBAction func buttonActionFromStoryboard(sender: UIButton)
{
    println("Button Action From Storyboard")
}

Pour créer UIButton de manière programmatique : 1- Ecrire dans "override func viewDidLoad()" :

        let uiButton    = UIButton.buttonWithType(UIButtonType.System) as UIButton
        uiButton.frame  = CGRectMake(16, 116, 288, 30)
        uiButton.setTitle("Second", forState: UIControlState.Normal);
        uiButton.addTarget(self, action: "buttonActionFromCode:", forControlEvents: UIControlEvents.TouchUpInside)
        self.view.addSubview(uiButton)

2- ajouter le func IBAction :

@IBAction func buttonActionFromCode(sender:UIButton)
{
    println("Button Action From Code")
}

0 votes

Depuis Swift 1.2, les downcasts ne peuvent plus être effectués avec "as", ils doivent être "forcés à échouer" avec "as !".

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