Wie erstelle ich eine Schaltfläche programmgesteuert?

256

Wie erstelle ich programmgesteuert grafische Elemente (wie a UIButton) in Swift? Ich habe versucht, eine Schaltfläche zu erstellen und einer Ansicht hinzuzufügen, konnte dies jedoch nicht.

val_lek
quelle

Antworten:

414

Hier ist eine vollständige Lösung zum UIButtonprogrammgesteuerten Hinzufügen einer mit der targetAction .
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")
}

Es ist wahrscheinlich besser zu verwenden NSLayoutConstraintframe die Schaltfläche für jeden iPhone-Bildschirm als sie richtig zu platzieren.

Code auf Swift 3.1 aktualisiert :

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")
}

Code auf Swift 4.2 aktualisiert :

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")
}

Das obige funktioniert immer noch, wenn func buttonActiondeklariert ist privateoder internal.

Anil Varghese
quelle
3
und vergessen Sie nicht, dass Ihre Zielklasse von NSObject
Alexey Globchastyy
7
und vergessen Sie nicht, dass die Funktion, die Ihre Aktion ist, nicht privat sein kann
Pablo Zbigy Jablonski
2
Es ist seltsam, dass sie beschlossen haben, Aktionen mit Zeichenfolgen auszuführen, anstatt eine Funktion zu verwenden (mit Zeichenfolgen ist es sogar unsicherer als Selektoren!). Abwärtskompatibilität mit Obj-C wahrscheinlich :(
Ixx
Gibt es eine Möglichkeit, den Eckenradius einer Schaltfläche zu ändern?
MoralCode
3
Ab Swift 1.2 können Downcasts nicht mehr mit "as" ausgeführt werden, sondern müssen mit "as!" "Forced failable" sein.
TenaciousJay
100

Auf diese Weise können Sie UIButton, UIlable und UITextfield programmgesteuert hinzufügen.

UIButton-Code

// 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)

UILabel-Code

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)

UITextField-Code

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

Hoffe das ist hilfreich für dich.

Akhtar
quelle
Warum benötigen Sie den Operator "as" in der ersten Codezeile, die Sie vor UIButton freigegeben haben?
Zumzum
buttonWithType gibt den Typ AnyObject zurück, daher müssen Sie ihn als UIButton umwandeln
Chris C
1
@ElgsQianChen Sie können diesen Code entsprechend Ihren Anforderungen verwenden. Wenn Sie beispielsweise eine UIButton hinzufügen möchten, wenn die Ansicht angezeigt wird, fügen Sie den Code in viewWillAppear hinzu.
Akhtar
1
Ab Swift 1.2 können Downcasts nicht mehr mit "as" ausgeführt werden, sondern müssen mit "as!" "Forced failable" sein.
TenaciousJay
Für Personen, die auf veraltete Warnungen für Objective C- Zeichenfolgenliterale
stoßen Die
61

Für Swift 3

let button = UIButton()
button.frame = CGRect(x: self.view.frame.size.width - 60, y: 60, width: 50, height: 50)
button.backgroundColor = UIColor.red
button.setTitle("your Button Name", for: .normal)
button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
self.view.addSubview(button)

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

Für Swift 4

 let button = UIButton()
 button.frame = CGRect(x: self.view.frame.size.width - 60, y: 60, width: 50, height: 50)
 button.backgroundColor = UIColor.red
 button.setTitle("Name your Button ", for: .normal)
 button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
 self.view.addSubview(button)

 @objc func buttonAction(sender: UIButton!) {
    print("Button tapped")
 }
Museer Ahamad Ansari
quelle
button.frame = (frame: CGRect(x: self.view.frame.size.width - 60, y: 20, width: 50, height: 50))sollte seinbutton.frame = CGRect(x: self.view.frame.size.width - 60, y: 20, width: 50, height: 50)
JC
2
In Swift 4 muss vor "func" "@objc" hinzugefügt werden.
Ruslan Leshchenko
29

Swift 3

let btn = UIButton(type: .custom) as UIButton
btn.backgroundColor = .blue
btn.setTitle("Button", for: .normal)
btn.frame = CGRect(x: 100, y: 100, width: 200, height: 100)
btn.addTarget(self, action: #selector(clickMe), for: .touchUpInside)
self.view.addSubview(btn)

func clickMe(sender:UIButton!) {
  print("Button Clicked")
}

Ausgabe

Geben Sie hier die Bildbeschreibung ein

user3182143
quelle
Danke, m8! Heute mit Swift anfangen, also ist alles irgendwie seltsam (:
Felipe
17

Wie das geht mit Swift 3.0 .

func createButton() {
    let button = UIButton(type: .system)
    button.frame = CGRect(x: 100.0, y: 100.0, width: 100.0, height: 100.0)
    button.setTitle(NSLocalizedString("Button", comment: "Button"), for: .normal)
    button.backgroundColor = .green
    button.addTarget(self, action: #selector(buttonAction(sender:)), for: .touchUpInside)
    view.addSubview(button)
}

@objc func buttonAction(sender: UIButton) {
    print("Button pushed")
}
CodeBender
quelle
16
 var sampleButton:UIButton?

 override func viewDidLoad() {
  super.viewDidLoad()

 }
 override func viewDidAppear(animated: Bool) {

  sampleButton = UIButton(type: .RoundedRect)
  //sampleButton.frame = CGRect(x:50, y:500, width:70, height:50)

  sampleButton!.setTitle("Sample \n UI Button", forState: .Normal)
  sampleButton!.titleLabel?.lineBreakMode = .ByWordWrapping
  sampleButton!.titleLabel?.textAlignment = .Center
  sampleButton!.setTitleColor(UIColor.whiteColor(), forState: .Normal)
  sampleButton!.layer.cornerRadius = 6
  sampleButton!.backgroundColor = UIColor.redColor().colorWithAlphaComponent(0.6)
  sampleButton?.tintColor =  UIColor.brownColor()


  //Add padding around text
  sampleButton!.titleEdgeInsets = UIEdgeInsetsMake(-10,-10,-10,-10)
  sampleButton!.contentEdgeInsets = UIEdgeInsetsMake(5,5,5,5)

  //Action set up
  sampleButton!.addTarget(self, action: "sampleButtonClicked", forControlEvents: .TouchUpInside)
  self.view.addSubview(sampleButton!)


  //Button Constraints:
  sampleButton!.translatesAutoresizingMaskIntoConstraints = false

  //To anchor above the tab bar on the bottom of the screen:
  let bottomButtonConstraint = sampleButton!.bottomAnchor.constraintEqualToAnchor(bottomLayoutGuide.topAnchor, constant: -20)

  //edge of the screen in InterfaceBuilder:
  let margins = view.layoutMarginsGuide
  let leadingButtonConstraint = sampleButton!.leadingAnchor.constraintEqualToAnchor(margins.leadingAnchor)

  bottomButtonConstraint.active = true
  leadingButtonConstraint.active = true


 }
 func sampleButtonClicked(){

  print("sample Button Clicked")

 }
AG
quelle
14

Die API hat sich nicht geändert - nur die Syntax hat sich geändert. Sie können ein UIButtonerstellen und es wie folgt hinzufügen:

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

Sie können so erstellen und Sie können auch so eine Aktion hinzufügen ....

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")
}
Dharmbir Singh
quelle
Entschuldigung, aber der Compiler hat einen Fehler in der Zeile "self.view.addSubview" gesendet (Ansicht: myButton). Der nächste Fehler ist: "Fremdargumentbezeichnung 'view:' in call"
val_lek
Bitte entfernen Sie diese Zeile self.view.addSubview (Ansicht: myButton) Weitere Informationen finden Sie in meiner bearbeiteten Antwort.
Dharmbir Singh
Vielen Dank, aber wie kann ich diesen Button auf self.view hinzufügen?
val_lek
6

Fügen Sie diesen Code in viewDidLoad
// add Button hinzu

            var button=UIButton(frame: CGRectMake(150, 240, 75, 30))
            button.setTitle("Next", forState: UIControlState.Normal)
            button.addTarget(self, action: "buttonTapAction:", forControlEvents: UIControlEvents.TouchUpInside)
            button.backgroundColor = UIColor.greenColor()
            self.view.addSubview(button)

Schreiben Sie diese Funktion außerhalb, sie wird aufgerufen, wenn Sie auf die Schaltfläche tippen

func buttonTapAction(sender:UIButton!)
{
    println("Button is working")
}
Nimmy Alphonsa Jose
quelle
6

In Swift 2 und iOS 9.2.1

var button: UIButton = UIButton(type: UIButtonType.Custom) as UIButton
self.button.frame = CGRectMake(130, 70, 60, 20)
self.button.setTitle("custom button", forState: UIControlState.Normal)
self.button.addTarget(self, action:"buttonActionFuncName", forControlEvents: UIControlEvents.TouchUpInside)
self.button.setTitleColor(UIColor.blackColor(), forState: .Normal)
self.button.layer.borderColor = UIColor.blackColor().CGColor
self.button.titleLabel?.font = UIFont(name: "Helvetica-Bold", size: 13)
self.view.addSubview(self.button)
Muhammad Qasim
quelle
6

Für Swift 5 genauso wie für Swift 4

 let button = UIButton()
 button.frame = CGRect(x: self.view.frame.size.width - 60, y: 60, width: 50, height: 50)
 button.backgroundColor = UIColor.red
 button.setTitle("Name your Button ", for: .normal)
 button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
 self.view.addSubview(button)

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

Es ist möglich. Sie machen alles ziemlich gleich, außer dass Sie die schnelle Syntax verwenden. Zum Beispiel könnten Sie einen UIButton in Code wie folgt erstellen:

 var button: UIButton = UIButton(frame: CGRectMake(0, 0, 100, 100))
Connor
quelle
3

So erstellen Sie einen UIButton aus dem Storyboard: 1 - Ziehen Sie das UIButton-Objekt aus der Objektbibliothek in den ViewController in der Storyboard-Datei. 2 - Zeigen Sie den Assistenten-Editor an. 3 - Ziehen Sie mit der rechten Maustaste aus dem oben erstellten UIButton in Ihre Klasse. Das Ergebnis ist folgendes:

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

So programmieren Sie UIButton programmgesteuert: 1- Schreiben Sie in "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- Fügen Sie die IBAction-Funktion hinzu:

@IBAction func buttonActionFromCode(sender:UIButton)
{
    println("Button Action From Code")
}
Alessandro Pirovano
quelle
Ab Swift 1.2 können Downcasts nicht mehr mit "as" ausgeführt werden, sondern müssen mit "as!" "Forced failable" sein.
TenaciousJay
3
            let myFirstButton = UIButton()
            myFirstButton.setTitle("Software Button", forState: .Normal)
            myFirstButton.setTitleColor(UIColor.redColor(), forState: .Normal)
            myFirstButton.frame = CGRectMake(100, 300, 150, 50)
            myFirstButton.backgroundColor = UIColor.purpleColor()
            myFirstButton.layer.cornerRadius = 14
            myFirstButton.addTarget(self, action: "pressed:", forControlEvents: .TouchUpInside)
            self.view.addSubview(myFirstButton)
            myFirstButton.hidden=true
            nameText.delegate = self


func pressed(sender: UIButton!) {
        var alertView = UIAlertView()
        alertView.addButtonWithTitle("Ok")
        alertView.title = "title"
        alertView.message = "message"
        alertView.show();
    }
abdul sathar
quelle
3

Ja im Simulator. Manchmal erkennt es den Selektor nicht, es scheint einen Fehler zu geben. Auch wenn ich nicht auf Ihren Code gestoßen bin, habe ich einfach den Aktionsnamen (Selektor) geändert. Es klappt

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)

Die Auswahlfunktion ist hier:

func buttonAction(sender:UIButton!)
{

    var btnsendtag:UIButton = sender
    if btnsendtag.tag == 22 {            
        //println("Button tapped tag 22")
    }
}
Dharmesh Kheni
quelle
Scheint, als würde ich auf dasselbe Problem stoßen. Ich habe die Schaltfläche zunächst als IBAction im Storyboard erstellt, aber ich erhalte die Meldung "Nicht erkannter Selektor an Instanz gesendet". Dann lösche ich die auf diese Weise erstellte IBAction und versuche, .addTarget zu verwenden. Beide führen zu demselben Fehler.
RayInNoIL
Für mich hat es funktioniert, den gesamten IBOutlet- und IBAction-Code in der .swift-Datei und alle Verbindungen in InterfaceBuilder zu löschen. Dann alles neu erschaffen.
RayInNoIL
2

Das funktioniert bei mir sehr gut, #DynamicButtonEvent #IOS #Swift #Xcode

func setupButtonMap(){
    let mapButton = UIButton(type: .system)
    mapButton.setImage(#imageLiteral(resourceName: "CreateTrip").withRenderingMode(.alwaysOriginal), for: .normal)
    mapButton.frame = CGRect(x: 0, y: 0, width: 34, height: 34)
    mapButton.contentMode = .scaleAspectFit
    mapButton.backgroundColor = UIColor.clear
    mapButton.addTarget(self, action: #selector(ViewController.btnOpenMap(_:)), for: .touchUpInside)
    navigationItem.leftBarButtonItem = UIBarButtonItem(customView: mapButton)
    }
@IBAction func btnOpenMap(_ sender: Any?) {
    print("Successful")
}
Lex
quelle
2

Schreiben Sie diesen Beispielcode in Swift 4.2, um die Schaltfläche programmgesteuert hinzuzufügen.

override func viewDidLoad() {
    super.viewDidLoad()
        let myButton = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 50))
        myButton.backgroundColor = .green
        myButton.setTitle("Hello UIButton", for: .normal)
        myButton.addTarget(self, action: #selector(myButtonAction), for: .touchUpInside)
        self.view.addSubview(myButton)
}

 @objc func myButtonAction(sender: UIButton!) {
    print("My Button tapped")
}
Parth
quelle
1
    // UILabel:
    let label = UILabel()
    label.frame = CGRectMake(35, 100, 250, 30)
    label.textColor = UIColor.blackColor()
    label.textAlignment = NSTextAlignment.Center
    label.text = "Hello World"
    self.view.addSubview(label)

    // UIButton:
    let btn: UIButton = UIButton(type: UIButtonType.Custom) as UIButton
    btn.frame = CGRectMake(130, 70, 60, 20)
    btn.setTitle("Click", forState: UIControlState.Normal)
    btn.setTitleColor(UIColor.blackColor(), forState: .Normal)
    btn.addTarget(self, action:Selector("clickAction"), forControlEvents: UIControlEvents.TouchUpInside)
    view.addSubview(btn)


    // Button Action:
    @IBAction func clickAction(sender:AnyObject)
    {
        print("Click Action")
    }
Der König
quelle
1

Schritt 1: Erstellen Sie ein neues Projekt

Geben Sie hier die Bildbeschreibung ein

Schritt 2: in ViewController.swift

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // CODE
        let btn = UIButton(type: UIButtonType.System) as UIButton        
        btn.backgroundColor = UIColor.blueColor()
        btn.setTitle("CALL TPT AGENT", forState: UIControlState.Normal)
        btn.frame = CGRectMake(100, 100, 200, 100)
        btn.addTarget(self, action: "clickMe:", forControlEvents: UIControlEvents.TouchUpInside)
        self.view.addSubview(btn)

    }

    func clickMe(sender:UIButton!) {
      print("CALL")
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

quelle
0

Swift: Ui Button programmgesteuert erstellen

let myButton = UIButton()

myButton.titleLabel!.frame = CGRectMake(15, 54, 300, 500)
myButton.titleLabel!.text = "Button Label"
myButton.titleLabel!.textColor = UIColor.redColor()
myButton.titleLabel!.textAlignment = .Center
self.view.addSubview(myButton)
Shanmugasundharam
quelle
0

Geben Sie hier die Bildbeschreibung ein

 func viewDidLoad(){
                    saveActionButton = UIButton(frame: CGRect(x: self.view.frame.size.width - 60, y: 0, width: 50, height: 50))
                    self.saveActionButton.backgroundColor = UIColor(red: 76/255, green: 217/255, blue: 100/255, alpha: 0.7)
                    saveActionButton.addTarget(self, action: #selector(doneAction), for: .touchUpInside)
                    self.saveActionButton.setTitle("Done", for: .normal)
                    self.saveActionButton.layer.cornerRadius = self.saveActionButton.frame.size.width / 2
                    self.saveActionButton.layer.borderColor = UIColor.darkGray.cgColor
                    self.saveActionButton.layer.borderWidth = 1
                    self.saveActionButton.center.y = self.view.frame.size.height - 80
                    self.view.addSubview(saveActionButton)
        }

          func doneAction(){
          print("Write your own logic")
         }
Sai Kumar Reddy
quelle
0

Normalerweise richte ich eine Erweiterung von UIBotton ein. Swift 5.

let button: UIButton = UIButton()
override func viewDidLoad() {
        super.viewDidLoad()
     button.setup(title: "OK", x: 100, y: 430, width: 220, height: 80, color: .yellow)
        buttonD.setTitleColor(.black, for: .normal)

}
extension UIButton {
    func setup(title: String, x: CGFloat, y: CGFloat, width: CGFloat, height: CGFloat, color: UIColor){
        frame = CGRect(x: x, y: y, width: width, height: height)
        backgroundColor = color
        setTitle(title , for: .normal) 
        }
    }
Rote Beete
quelle
-1
Uilabel code 

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)
varun
quelle
2
Es wird immer empfohlen, Ihrem Code eine Erklärung hinzuzufügen
Bowdzone
-2
override func viewDidLoad() {

super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    var imageView = UIImageView(frame: CGRectMake(100, 150, 150, 150));
    var image = UIImage(named: "BattleMapSplashScreen.png");
    imageView.image = image;
    self.view.addSubview(imageView);

}
Durgesh
quelle