Comment déterminer quel champ Text est actif swift

je ne peux pas comprendre ce qui UITextField est actuellement actif donc je peux effacer son texte s'ils frappent cancel sur un UIBarButtonItem. Voici mon code. Il y a une vue avec un UIPickerView,UIToolBar et deux boutons-poussoirs. L'élément d'annulation a une action qui va effacer son texte seulement je ne peux pas comprendre comment obtenir le correct UITextField.

j'ai essayé ces deux:

@IBAction func cancelText(sender: AnyObject) {


    if self.truckYear.editing == true{

        println("truckYear")

        clearText(self.truckYear)
    } else if self.truckMake.editing == true{

        clearText(self.truckMake)
    }
}
@IBAction func doneText(sender: AnyObject) {

    pickerView.hidden = true
}


func clearText(textField:UITextField){

    println("in clear text")

    textField.text = nil
}

Et:

@IBAction func cancelText(sender: AnyObject) {


    if self.truckYear.isFirstResponder(){

        println("truckYear")

        clearText(self.truckYear)
    } else if self.truckMake.isFirstResponder(){

        clearText(self.truckMake)
    }
}
@IBAction func doneText(sender: AnyObject) {

    pickerView.hidden = true
}


func clearText(textField:UITextField){

    println("in clear text")

    textField.text = nil
}
21
demandé sur rmaddy 2015-06-18 17:49:41

6 réponses

Vous pouvez déclarer un UITextField propriété dans votre classe, et d'attribuer l'actuel champ de texte textFieldDidBeginEditing. Alors vous pouvez simplement appeler ce champ de texte quand vous en avez besoin.

class ViewController : UIViewController, UITextFieldDelegate {

   var activeTextField = UITextField()

   // Assign the newly active text field to your activeTextField variable
   func textFieldDidBeginEditing(textField: UITextField) {

        self.activeTextField = textField
   }

   // Call activeTextField whenever you need to
   func anotherMethod() {

       // self.activeTextField.text is an optional, we safely unwrap it here
       if let activeTextFieldText = self.activeTextField.text {
             print("Active text field's text: \(activeTextFieldText)")
             return;
       }

       print("Active text field is empty")
   }
}
34
répondu Randy 2017-12-15 09:54:54

dans swift 4:

vous pouvez obtenir de l'actif UITextField comme ça

extension UIView {
func getSelectedTextField() -> UITextField? {

    let totalTextFields = getTextFieldsInView(view: self)

    for textField in totalTextFields{
        if textField.isFirstResponder{
            return textField
        }
    }

    return nil

}

func getTextFieldsInView(view: UIView) -> [UITextField] {

    var totalTextFields = [UITextField]()

    for subview in view.subviews as [UIView] {
        if let textField = subview as? UITextField {
            totalTextFields += [textField]
        } else {
            totalTextFields += getTextFieldsInView(view: subview)
        }
    }

    return totalTextFields
}}

et puis vous l'appeler comme ça

let current = view.getSelectedTextField()
10
répondu Reimond Hill 2018-02-06 15:53:46

afin d'améliorer la réponse de @Reimond Swift 4

extension UIView {
    var textFieldsInView: [UITextField] {
        return subviews
            .filter ({ !( is UITextField) })
            .reduce (( subviews.compactMap {  as? UITextField }), { summ, current in
                return summ + current.textFieldsInView
        })
    }
    var selectedTextField: UITextField? {
        return textFieldsInView.filter { .isFirstResponder }.first
    }
}

utilisation:

view.selectedTextField

2
répondu Vyacheslav 2018-07-16 10:06:51

Utiliser le délégué:

optional func textFieldDidEndEditing(_ textField: UITextField)

cela vous indiquera quand le textfield actif termine l'édition, et textField contient un pointeur vers celui qui ne va plus être actif.

0
répondu Almo 2015-06-18 14:52:33
/// Finds the textField that is the first responder in a view hierarchy
func findActiveTextField(in subviews: [UIView], textField: inout UITextField?) {

    guard textField == nil else { return }

    for view in subviews {
        if let tf = view as? UITextField, view.isFirstResponder {
            textField = tf
            break
        }
        else if !view.subviews.isEmpty {
            findActiveTextField(in: view.subviews, textField: &textField)
        }
    }
}

// Usage
var aView: UIView = UIView()
var activeField : UITextField?
findActiveTextField(in: aView.subviews, textField: &activeField)
0
répondu John Slade 2017-04-27 17:01:30

j'ai écrit une bibliothèque pour gérer la Création de Forme Formulaire Swift Pop. Il n'utilise pas tags mais définit plutôt une source de données qui contient des champs et utilise indexPathForCell à la demande, et qui est le principe actif de textfield. Consultez le code source pour en savoir plus!

0
répondu aBikis 2018-05-15 02:15:34