web-dev-qa-db-fra.com

Effacer le texte UITextField Placeholder au robinet

Dans Xcode4, j'ai créé un texte de substitution pour un UITextField et j'aimerais qu'il soit effacé lorsque l'utilisateur tape dans la zone.

Ainsi, dans l'inspecteur d'attributs du champ de texte, j'ai cliqué sur "Effacer au début de l'édition", mais cela ne supprime pas immédiatement le texte lorsque je tape dans la zone de texte (il ne disparaît que lorsque vous commencez à taper).

Existe-t-il un moyen de supprimer le texte fictif immédiatement en tapotant dans la zone de texte? 

21
Snowcrash

faites de votre ViewController le délégué de textField et implémentez ces deux méthodes:

- (void)textFieldDidBeginEditing:(UITextField *)textField {
    textField.placeholder = nil;
}

- (void)textFieldDidEndEditing:(UITextField *)textField {
    textField.placeholder = @"Your Placeholdertext";
}
66
Matthias Bauch

La solution proposée par Matthias Bauch fonctionne bien, mais que se passe-t-il lorsque vous avez plus d'une UITextField à craindre? Vous devez maintenant identifier la variable UITextField à laquelle il est fait référence dans textFieldDidEndEditing:textField (éventuellement en utilisant la propriété tag), ce qui entraîne davantage de code et de logique inutiles.

Une solution beaucoup plus simple: attribuez simplement une couleur claire au texte de l’espace réservé et, une fois l’édition terminée, revenez à sa couleur originale. De cette façon, votre textFieldDidEndEditing:textField ne doit pas nécessairement identifier la textField pour rétablir le texte correspondant après l'avoir annulé, comme dans la solution de Bauch.

- (void)textFieldDidBeginEditing:(UITextField *)textField {
    [textField setValue:[UIColor clearColor] forKeyPath:@"_placeholderLabel.textColor"];
}

- (void)textFieldDidEndEditing:(UITextField *)textField {
    [textField setValue:[UIColor placeholderColor] forKeyPath:@"_placeholderLabel.textColor"];
}
8
etayluz

Vous devez également vérifier si le champ de texte est vide, puis vous devez mettre à nouveau un espace réservé.

- (void)textFieldDidBeginEditing:(UITextField *)textField {
    textField.placeholder = nil;
}

- (void)textFieldDidEndEditing:(UITextField *)textField 
{
   if ([textField.text isEqualToString:@""] || [[textField.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length] == 0))
   {
       [textField setText:@""];
       textField.placeholder = @"Your Placeholdertext";
   }
}
3
Maulik

utilisez ceci..

- (void)textFieldDidBeginEditing:(UITextField *)textField{
    textField.placeholder=nil;
}

n'oubliez pas d'ajouter le délégué pour le champ de texte à votre propriétaire de fichier.

1
Ankit Srivastava

Si vous avez plus d'un TextField

1) Ajouter une variable de chaîne à votre classe

class YourViewController : UIViewController {

var placeHolder = ""

2) Ajouter UITextFieldDelegate

extension YourViewController : UITextFieldDelegate {

func textFieldDidBeginEditing(_ textField: UITextField) {
    placeHolder = textField.placeholder ?? ""
    textField.placeholder = ""
}

func textFieldDidEndEditing(_ textField: UITextField) {
    if textField.placeholder == ""{
    textField.placeholder = placeHolder
    }
}
1
Ammar

La solution de @etayluz est meilleure (à mon avis), car vous n'avez plus à vous soucier de l'attribution de texte à un espace réservé . Si vous avez des champs de texte personnalisés à différents endroits de votre application et que vous voulez qu'ils se comportent de manière égale comme je le souhaite dans mon cas), vous pouvez ajouter ce code à la classe de votre TextField personnalisée:

class CustomTextField: UITextField, UITextFieldDelegate {
     private func setup() {
    //do additional setup like attributedPlaceholder, inset, etc.
        self.delegate = self
    }

    override func awakeFromNib() {
        super.awakeFromNib()
        setup()
    }

//    MARK: UITextFieldDelegate methods

    func textFieldDidBeginEditing(textField: UITextField) {
        textField.setValue(UIColor.clearColor(), forKeyPath: "_placeholderLabel.textColor")
    }

    func textFieldDidEndEditing(textField: UITextField) {
        textField.setValue(UIColor.lightGrayColor(), forKeyPath: "_placeholderLabel.textColor")
    }
}

Mais si vous avez besoin de méthodes UITextFieldDelegate spécifiques pour chaque textField, vous devez implémenter cette logique individuellement:

class LoginViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet weak var emailTextField: CustomTextField!
    @IBOutlet weak var passwordTextField: CustomTextField!

override func viewDidLoad() {
        super.viewDidLoad()
textFields = [emailTextField, passwordTextField]
        for textField in textFields {
            textField.delegate = self
        }

//    MARK: UITextFieldDelegate methods

    func textFieldDidBeginEditing(textField: UITextField) {
        textField.setValue(UIColor.clearColor(), forKeyPath: "_placeholderLabel.textColor")
    }

    func textFieldDidEndEditing(textField: UITextField) {
        textField.setValue(UIColor.lightGrayColor(), forKeyPath: "_placeholderLabel.textColor")
    }
}
0
Yurii Koval

Dans votre fichier .h, déclarez une fonction comme

-(IBAction)clear:(id)sender;

attachez cette fonction à votre événement de touché de votre UITextField.

dans votre fichier .m

 -(IBAction)clear:(id)sender 

{
   myplaceHolderText.text=@"";
 }
0
Ajeet Pratap Maurya

En cas de Swift 3 ou plus tard

func textFieldDidBeginEditing(_ textField: UITextField) {
    textField.placeholder = nil
}

func textFieldDidEndEditing(_ textField: UITextField) {
    textField.placeholder = "Text Placeholder"
}
0
Ghulam Rasool
- (void)textFieldDidBeginEditing:(UITextField *)textField{
    textField.placeholder=nil;
}

textfield delegate rend la valeur de titulaire de place égale à zéro

0
chaithraVeeresh