Search code examples
iosswiftsetfocus

How can I go to / activate / setFocus on an Textfield after an alert


I want to set Focus (activate) a textfield, after an error message appeared and the user clicked OK. In VBA it was something like txtbox.SetFocus

//
//  ViewController.swift
//  Trinkgeldrechner
//
//  Created by Joshua Fenster on 23.07.16.
//  Copyright © 2016 purple. All rights reserved.
//

import UIKit

class ViewController: UIViewController, UITextFieldDelegate{




    @IBOutlet weak var lableTrinkgeldEuro: UILabel!

    @IBOutlet weak var labelGesamtbetragEuro: UILabel!
    @IBOutlet weak var textfieldUserEingabePreisdesAbends: UITextField!
    @IBOutlet weak var textfieldUserEingabeProzentTrinkgeld: UITextField!

    //-- ME---

    @IBOutlet weak var switchService: UISwitch!
    @IBOutlet weak var switchFast: UISwitch!

    @IBAction func switchACTIONService(sender: AnyObject)
    {
        check()
    }


    @IBAction func switchACTIONFast(sender: AnyObject)
    {
        check()
    }





    //@IBAction func textfieldACTIONUserEingabeProzentTrinkgeld(sender: AnyObject)
    //{
        //trinkgeldBerechnen()
   // }

    @IBAction func textfieldACTIONUserEingabeProzentTringeld(sender: AnyObject)
    {
      check()

    }


    @IBAction func buttonClear(sender: AnyObject)
    {
        clear()
    }


    //-----------------------------------------------------------------------

    //---- Globale Variablen


    var gesamtbetrag: Float = 0.00

    var trinkgeld: Float = 0.00

    var strPreisdesAbends : String = ""

    var strProzentTrinkgeld : String = ""

    var trinkgeldMulti: Float = 0.00

    var trinkgeldMulti2: Float = 0.00







     //-----------------------------------------------------------------------

    // ---- Funktionen


    func check()
    {
        if (textfieldUserEingabePreisdesAbends.text == "")
        {
            displayAlert()
            clear()

        }
        else
        {
            trinkgeldBerechnen()
        }
    }


    func trinkgeldBerechnen()
    {
        strPreisdesAbends = textfieldUserEingabePreisdesAbends.text!
        strProzentTrinkgeld = textfieldUserEingabeProzentTrinkgeld.text!

            if switchService.on
            {
                trinkgeldMulti = 1
            }
            else
            {
                trinkgeldMulti = 0
            }


            if switchFast.on
            {
                trinkgeldMulti2 = 1
            }
            else
            {
                trinkgeldMulti2 = 0
            }

        //----- Strings in Zahlen

        let preisdesabends = Float(strPreisdesAbends)
        let prozenttrinkgeld = Float(strProzentTrinkgeld)

        //----- Berechnung

        trinkgeld = preisdesabends! * ((prozenttrinkgeld! + trinkgeldMulti + trinkgeldMulti2) / 100)

        gesamtbetrag = preisdesabends! + trinkgeld

        ausgabeTrinkgeld()
    }


    func ausgabeTrinkgeld()
    {

        let formatGesamtbetrag = String(format:"%0.2f", gesamtbetrag)
        let formatTrinkgeld = String(format:"%0.2f", trinkgeld)



        lableTrinkgeldEuro.text = " \(formatTrinkgeld) €"
        labelGesamtbetragEuro.text = " \(formatGesamtbetrag) €"


    }


    func displayAlert()
    {

        let titel = "Rechnungsbetrag"
        let message = "Du musst erst den Rechnungsbetrag eintragen"
        let okText = "Ok"

        let alert = UIAlertController(title: titel, message: message, preferredStyle: UIAlertControllerStyle.Alert)

        let okButton = UIAlertAction(title: okText, style: UIAlertActionStyle.Cancel, handler: nil)
        alert.addAction(okButton)

        presentViewController(alert, animated: true, completion: nil )

    }


   // --- Clear


    func clear()
    {
        labelGesamtbetragEuro.text = "0.00€"
        lableTrinkgeldEuro.text = "0.00€"
        textfieldUserEingabeProzentTrinkgeld.text = ""
        textfieldUserEingabePreisdesAbends.text = ""
        switchService.setOn(false, animated: true)
        switchFast.setOn(false, animated: true)
    }

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

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

    // Tastatur ausblenden

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        hideKeyboards()

    }
    func hideKeyboards() {
        textfieldUserEingabePreisdesAbends.resignFirstResponder()
        textfieldUserEingabeProzentTrinkgeld.resignFirstResponder()
    }


}

Solution

  • To set the focus on a textfield you should call becomeFirstResponder().

    textfield.becomeFirstResponder()
    

    Update. If you want to set the focus after the alert is dismissed, set it as a handler:

    let okButton = UIAlertAction(title: okText, style: UIAlertActionStyle.Cancel, handler: { _ in
        textfield.becomeFirstResponder()
    })
    alert.addAction(okButton)