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?
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";
}
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"];
}
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";
}
}
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.
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
}
}
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")
}
}
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=@"";
}
En cas de Swift 3 ou plus tard
func textFieldDidBeginEditing(_ textField: UITextField) {
textField.placeholder = nil
}
func textFieldDidEndEditing(_ textField: UITextField) {
textField.placeholder = "Text Placeholder"
}
- (void)textFieldDidBeginEditing:(UITextField *)textField{
textField.placeholder=nil;
}
textfield delegate rend la valeur de titulaire de place égale à zéro