2011-12-16 19 views
21

En Xcode4 he creado un texto de marcador de posición para un UITextField y me gustaría que desaparezca cuando el usuario toque el cuadro.Borrar Texto de marcador de posición de UITextField al tocar

Por lo tanto, en el Inspector de atributos para el campo de texto he hecho clic en "Borrar cuando se inicia la edición"; sin embargo, esto no elimina inmediatamente el texto cuando pulso en el cuadro de texto (solo desaparece al comenzar a escribir).

¿Hay alguna forma de eliminar el texto del marcador de posición inmediatamente al tocar en el cuadro de texto?

Respuesta

67

hacer su ViewController el delegado de la textField y poner en práctica esos dos métodos:

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

- (void)textFieldDidEndEditing:(UITextField *)textField { 
    textField.placeholder = @"Your Placeholdertext"; 
} 
+0

En el segundo método, debe verificar que el campo de texto tenga un valor vacío o no? – KingofBliss

+4

no. El texto del marcador de posición simplemente no es visible si hay texto "regular". –

+0

Oh .. Sí, lo olvidé ... :) Gracias por la información .. – KingofBliss

1

uso de este ..

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

no se olvide de añadir el delegado para el campo de texto en el archivo de propietario.

-1

En la acción del botón Evento poner este código:

txtName.placeholder = @""; 
0

En su archivo .h declarar una función como

-(IBAction)clear:(id)sender;

asocie esta función a su evento de touchdown de su UITextField.

en su archivo .m

-(IBAction)clear:(id)sender 

{ 
    [email protected]""; 
} 
3

También debe comprobar si el texto presentado está vacía, entonces debería poner de nuevo marcador de posición

- (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"; 
    } 
} 
8

La solución proporcionada por Matthias Bauch funciona bien, pero lo sucede cuando tiene más de un UITextField de qué preocuparse? Ahora tiene que identificar a qué UITextField se hace referencia en textFieldDidEndEditing:textField (posiblemente mediante el uso de la propiedad de etiqueta), y eso da como resultado más código y lógica innecesarios.

Una solución mucho más simple: simplemente asigne un color claro al texto del marcador de posición, y cuando termine de editar, vuelva a su color original. De esta manera, su textFieldDidEndEditing:textField no tiene que identificar el textField para volver atrás su texto correspondiente después de que se anuló como en la solución de Bauch. delegado

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

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

Esto podría causar el rechazo de la tienda de aplicaciones para usar API privada – Hellojeffy

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

campo de texto crea valor de marcador de posición a cero

0

solución Las @etayluz 's es mejor (mi opinión), ya que no tiene que preocuparse acerca de la asignación de texto placeholder'a nuevo . Si tiene campos de texto personalizados en diferentes lugares de su aplicación y quiere que se comporten igual (ya que necesito en mi caso) se puede añadir este código a la clase de su campo de texto personalizado:

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") 
    } 
} 

Pero si es necesario tener métodos de UITextFieldDelegate específicos para textField individuo sí es necesario para poner en práctica esta lógica de forma individual:

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

En caso de SWIFT 3 o posterior

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

func textFieldDidEndEditing(_ textField: UITextField) { 
    textField.placeholder = "Text Placeholder" 
} 
Cuestiones relacionadas