2011-12-16 15 views
21

In Xcode4 ho creato un testo segnaposto per un UITextField e vorrei che venisse cancellato quando l'utente toccava nella casella.Cancella testo UITextField segnaposto a tocco

Quindi, nell'Inspector degli attributi per il campo di testo, ho fatto clic su "Cancella quando inizia la modifica", tuttavia questo non rimuove immediatamente il testo quando tocco la casella di testo (scompare solo quando inizi a digitare).

C'è un modo per rimuovere immediatamente il testo segnaposto toccando nella casella di testo?

risposta

67

rendere il vostro ViewController il delegato del textField e implementare questi due metodi:

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

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

Nel secondo metodo devi verificare che il campo di testo abbia o meno un valore vuoto? – KingofBliss

+4

no. Il testo segnaposto non è visibile se c'è un testo "normale". –

+0

Oh .. Sì, mi dimentico .. :) Grazie per le informazioni .. – KingofBliss

1

uso questo ..

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

non dimenticare di aggiungere il delegato per il campo di testo al file proprietario.

-1

Su azione Pulsante Evento inserire questo codice:

txtName.placeholder = @""; 
0

Nel file .h dichiarare una funzione come

-(IBAction)clear:(id)sender;

collegare questa funzione a il tuo evento di touchdown del tuo UITextField.

nel file .m

-(IBAction)clear:(id)sender 

{ 
    [email protected]""; 
} 
3

Si dovrebbe anche verificare se il testo presentato è vuota, allora si dovrebbe mettere segnaposto nuovo

- (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 soluzione fornita da Matthias Bauch funziona bene, ma che cosa succede quando hai più di uno UITextField di cui preoccuparsi? Ora è necessario identificare a quale UITextField si fa riferimento in textFieldDidEndEditing:textField (eventualmente utilizzando la proprietà tag), e che si ottiene un codice e una logica più inutili.

Una soluzione molto più semplice: basta assegnare un colore chiaro al testo segnaposto e, una volta terminata la modifica, tornare al suo colore originale. In questo modo, il tuo textFieldDidEndEditing:textField non deve identificare lo textField per ripristinare il testo corrispondente dopo che è stato annullato come nella soluzione di Bauch.

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

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

Ciò potrebbe causare il rifiuto dell'app store per l'utilizzo di API private – Hellojeffy

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

textfield delegato rendono valore segnaposto a zero

0

soluzione l' @etayluz è meglio (il mio parere), perché non è necessario preoccuparsi di assegnare il testo di nuovo placeholder'a . Se si dispone di campi di testo personalizzati in diverse aree di vostra app e vuole che si comportino allo stesso modo (come ho bisogno nel mio caso), è possibile aggiungere questo codice alla classe del TextField personalizzato:

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

Ma se avete bisogno di avere metodi specifici di UITextFieldDelegate per textField individuale che fai necessario implementare questa logica per esso 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

In caso di SWIFT 3 o successivo

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

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