web-dev-qa-db-fra.com

Comment puis-je vérifier quand un UITextField change?

J'essaie de vérifier quand un champ de texte change, équivalent aussi à la fonction utilisée pour textView - textViewDidChange jusqu'à présent, j'ai fait ceci: 

  func textFieldDidBeginEditing(textField: UITextField) {
        if self.status.text == "" && self.username.text == "" {
            self.topRightButton.enabled = false
        } else {   
            self.topRightButton.enabled = true
        }
    }

Quel type de travail fonctionne, mais la topRightButton est activée dès que le champ de texte est activé, je souhaite l’activer uniquement lorsque le texte est réellement saisi?

205
user4184036

Rapide

textField.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged)

Ensuite, vous pouvez simplement appeler votre fonction!

func textFieldDidChange(textField: UITextField) {
    //your code
}

Swift 2.2

textField.addTarget(self, action: #selector(YourViewController.textFieldDidChange(_:)), forControlEvents: UIControlEvents.EditingChanged)

et

func textFieldDidChange(textField: UITextField) {
    //your code
}

Swift 3 & Swift 4.1

textField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)

et

func textFieldDidChange(_ textField: UITextField) {

}

Swift 4

@objc func textFieldDidChange(_ textField: UITextField) {

}

OBJECTIF C

[textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];

et la méthode textFieldDidChange est

-(void)textFieldDidChange :(UITextField *) textField{
    //your code
}
566
Fawad Masud

Vous pouvez établir cette connexion dans le générateur d'interface.

  1. Dans votre storyboard, cliquez sur l’assistant éditeur en haut de l’écran (deux cercles au milieu) .  Assistant editor selected

  2. Ctrl + clic sur le champ de texte dans le générateur d'interface.

  3. Faites glisser de EditingChanged à l'intérieur de votre classe de contrôleur de vue dans la vue de l'assistant .  Making connection

  4. Nommez votre fonction ("textDidChange" par exemple) et cliquez sur connect .  Naming function

103
rmooney

Swift 3.0

textField.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged)

et méthode de la poignée:

func textFieldDidChange(textField: UITextField) { 

}

Swift 4.0

textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(_:)),
                          for: UIControlEvents.editingChanged)

et méthode de la poignée:

@objc func textFieldDidChange(_ textField: UITextField) {

}
41
Robert

La façon dont je l'ai traité jusqu'à présent: dans UITextViewDelegate

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool
{
    // text hasn't changed yet, you have to compute the text AFTER the edit yourself
    let updatedString = (textField.text as NSString?)?.stringByReplacingCharactersInRange(range, withString: string)

    // do whatever you need with this updated string (your code)


    // always return true so that changes propagate
    return true
}

Version Swift4 

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    let updatedString = (textField.text as NSString?)?.replacingCharacters(in: range, with: string)
    return true
}
19
Vinzzz

Swift 3

 textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(sender:)), for: UIControlEvents.editingChanged)
14

Swift 3.0.1+ (Certaines des autres réponses à Swift 3.0 ne sont pas à jour)

textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(_:)),
                          for: UIControlEvents.editingChanged)

func textFieldDidChange(_ textField: UITextField) {

}
7
aviran

textField (_: shouldChangeCharactersIn: replacementString :) a travaillé pour moi dans Xcode 8, Swift 3 si vous souhaitez vérifier chaque pression de touche.

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    // Whatever code you want to run here.
    // Keep in mind that the textfield hasn't yet been updated,
    // so use 'string' instead of 'textField.text' if you want to
    // access the string the textfield will have after a user presses a key

    var statusText = self.status.text
    var usernameText = self.username.text

    switch textField{
    case self.status:
        statusText = string
    case self.username:
        usernameText = string
    default:
        break
    }

    if statusText == "" && usernameText == "" {
        self.topRightButton.enabled = false
    } else {   
        self.topRightButton.enabled = true
    }

    //Return false if you don't want the textfield to be updated
    return true
}
5
radthemad4

Swift 4

Conforme à UITextFieldDelegate .

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    // figure out what the new string will be after the pending edit
    let updatedString = (textField.text as NSString?)?.replacingCharacters(in: range, with: string)

    // Do whatever you want here


    // Return true so that the change happens
    return true
}
5
drewster

Vous pouvez utiliser cette méthode de délégué à partir de UITextFieldDelegate. Il se déclenche à chaque changement de personnage.

(Objective C) textField:shouldChangeCharactersInRange:replacementString:
(Swift) textField(_:shouldChangeCharactersInRange:replacementString:)

Cependant, CE SEULEMENT FIREAVANTun changement est effectué (en fait, un changement est effectué uniquement si vous retournez la valeur true à partir d'ici).

4
Abubakr Dar

Swift 4

textField.addTarget(self, action: #selector(textIsChanging), for: UIControlEvents.editingChanged)

@objc func textIsChanging(_ textField:UITextField) {

 print ("TextField is changing")

}

Si vous voulez apporter une modification une fois que l'utilisateur a complètement saisi (il sera appelé une fois que l'utilisateur aura quitté le clavier ou appuyé sur entrée).

textField.addTarget(self, action: #selector(textDidChange), for: UIControlEvents.editingDidEnd)

 @objc func textDidChange(_ textField:UITextField) {

       print ("TextField did changed") 
 }
1
Anamika

Peut-être utiliser RxSwift?

avoir besoin

pod 'RxSwift',    '~> 3.0'
pod 'RxCocoa',    '~> 3.0'

ajouter des importations évidemment

import RxSwift
import RxCocoa

Donc tu as un textfield : UITextField

let observable: Observable<String?> = textField.rx.text.asObservable()
observable.subscribe(
            onNext: {(string: String?) in
                print(string!)
        })

U a 3 autres méthodes ..

  1. onError
  2. onCompleted
  3. onDisposed
  4. onNext
1
marlonpya

Vous devriez suivre ces étapes:

  1. Faire une référence de sortie au champ de texte
  2. AssignUITextFieldDelegate à la classe de contrôleur 
  3. Configurez votre TextField.delegate
  4. Implémentez toutes les fonctions dont vous avez besoin

Exemple de code:

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet var yourTextFiled : UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        yourTextFiled.delegate = self
    }


    func textFieldDidEndEditing(_ textField: UITextField) {
        // your code
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        // your code
    }

    .
    .
    .
}
1
M.Hazara
txf_Subject.addTarget(self, action:#selector(didChangeFirstText), for: .editingChanged)

@objc func didChangeText(textField:UITextField) {
    let str = textField.text
    if(str?.contains(" "))!{
        let newstr = str?.replacingOccurrences(of: " ", with: "")
        textField.text = newstr
    }
}

@objc func didChangeFirstText(textField:UITextField) {
    if(textField.text == " "){
        textField.text = ""
    }
}
1
Yogesh Tandel

créer une nouvelle classe personnalisée MaterialTextfield.Swift

class MaterialTextfield: UITextField,UITextFieldDelegate {

var bottomBorder = UIView()
var shouldShowEditing = false

override func awakeFromNib() {

    // Setup Bottom-Border

    self.delegate = self
    self.translatesAutoresizingMaskIntoConstraints = false

    bottomBorder = UIView.init(frame: CGRect(x: 0, y: 0, width: 0, height: 0))
    bottomBorder.backgroundColor = UIColor(rgb: 0xE2DCD1) // Set Border-Color
    bottomBorder.translatesAutoresizingMaskIntoConstraints = false

    addSubview(bottomBorder)

    bottomBorder.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
    bottomBorder.leftAnchor.constraint(equalTo: leftAnchor).isActive = true
    bottomBorder.rightAnchor.constraint(equalTo: rightAnchor).isActive = true
    bottomBorder.heightAnchor.constraint(equalToConstant: 1).isActive = true // Set Border-Strength

}
@IBInspectable var hasError: Bool = false {
    didSet {
        if (hasError) {
            bottomBorder.backgroundColor = UIColor.red//error color
        } else {
            bottomBorder.backgroundColor = UIColor(rgb: 0xE2DCD1)//passive color
        }

    }
}
@IBInspectable var showEditing: Bool = false{
    didSet {
        if (showEditing) {
            bottomBorder.backgroundColor = UIColor(rgb: 0x56B5CA)//active color
        } else {
            bottomBorder.backgroundColor = UIColor(rgb: 0xE2DCD1)//passive color
        }

    }

}

func textFieldDidBeginEditing(_ textField: UITextField) {//listen to on edit event
    showEditing = !self.showEditing
}
func textFieldDidEndEditing(_ textField: UITextField) {//listen to on end edit event
    showEditing = !self.showEditing
}

func textFieldShouldReturn(_ textField: UITextField) -> Bool {//listen to return button event
    textField.resignFirstResponder() // return button will close keyboard
    return true
}

}
0
Muhammad Asyraf

Voici comment ajouter un textField text change listener en utilisant Swift 3 :

Déclarez votre classe comme UITextFieldDelegate

override func viewDidLoad() {
    super.viewDidLoad()

    textField.delegate = self

    textField.addTarget(self, action: #selector(UITextFieldDelegate.textFieldShouldEndEditing(_:)), for: UIControlEvents.editingChanged)
}

Ensuite, ajoutez simplement une fonction textFieldShouldEndEditing:

func textFieldShouldEndEditing(_ textField: UITextField) -> Bool { // do stuff
        return true 
}
0
Satnam Sync