it-swarm-pt.tech

Limpar o texto do espaço reservado UITextField na torneira

No Xcode4, criei algum texto de espaço reservado para um UITextField e gostaria que ele fosse limpo quando o usuário tocar na caixa.

Então, no Inspetor de Atributos do campo de texto, cliquei em "Limpar quando a edição foi iniciada", mas isso não remove imediatamente o texto quando eu clico na caixa de texto (ele só desaparece quando você começa a digitar).

Existe alguma maneira de remover o texto de espaço reservado imediatamente ao tocar na caixa de texto? 

21
Snowcrash

torne seu ViewController o delegado do textField e implemente esses dois métodos:

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

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

A solução fornecida por Matthias Bauch funciona bem, mas o que acontece quando você tem mais do que uma UITextField para se preocupar? Agora você precisa identificar qual UITextField é referida em textFieldDidEndEditing:textField (possivelmente pelo uso da propriedade tag), e isso resulta em mais código e lógica desnecessários.

Uma solução muito mais simples: basta atribuir uma cor clara ao texto do espaço reservado e, quando terminar de editar, voltar à sua cor original. Dessa forma, seu textFieldDidEndEditing:textField não precisa identificar a textField para voltar seu texto correspondente depois que ele foi anulado como na solução 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

Você também deve verificar se o campo de texto está vazio, então você deve colocar o espaço reservado novamente

- (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

usa isto..

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

não esqueça de adicionar o delegado para o campo de texto ao seu arquivo Proprietário.

1
Ankit Srivastava

Se você tiver mais de um TextField

1) Adicione a variável String à sua classe

class YourViewController : UIViewController {

var placeHolder = ""

2) Adicionar 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

A solução do @etayluz é melhor (minha opinião), porque você não precisa se preocupar em atribuir novamente o texto do placeholder'a. Se você tiver textFields personalizados em lugares diferentes do seu aplicativo e quiser que eles se comportem igualmente (como eu preciso no meu caso) você pode adicionar este código à sua classe TextField personalizada:

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

Mas se você precisa ter métodos específicos de UITextFieldDelegate para textField individual, você precisa implementar essa lógica individualmente:

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

No seu arquivo .h declarar uma função como

-(IBAction)clear:(id)sender;

anexe esta função ao seu evento touchdown da sua UITextField.

no seu arquivo .m

 -(IBAction)clear:(id)sender 

{
   [email protected]"";
 }
0
Ajeet Pratap Maurya

Em caso de Swift 3 ou posterior

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;
}

delegado de campo de texto faz um valor de espaço reservado para zero

0
chaithraVeeresh