2011-12-16 27 views
21

W Xcode4 utworzyłem tekst zastępczy dla UITextField i chciałbym, aby został wyczyszczony, gdy użytkownik kliknie w polu.Wyczyść tekst UITextField Tekst zastępczy na stuknij

Tak więc w Inspektorze atrybutów dla pola tekstowego kliknąłem "Wyczyść przy rozpoczęciu edycji", ale nie powoduje to natychmiastowego usunięcia tekstu po dotknięciu pola tekstowego (znika tylko wtedy, gdy zaczynasz pisać).

Czy jest jakiś sposób usunięcia tekstu zastępczego natychmiast po stuknięciu w polu tekstowym?

Odpowiedz

67

dokonać ViewController Delegat textField i wdrożenie tych dwóch metod:

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

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

W drugiej metodzie należy sprawdzić, czy pole tekstowe ma pustą wartość, czy nie? – KingofBliss

+4

nie. Tekst zastępczy nie jest widoczny, jeśli istnieje "zwykły" tekst. –

+0

Oh .. Tak, zapomnę .. :) Dzięki za informacje .. – KingofBliss

1

wykorzystanie tego ..

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

nie zapomnij dodać delegata do pola tekstowego do pliku Właściciela.

-1

Na działania Przycisk Event umieścić ten kod:

txtName.placeholder = @""; 
0

W pliku .h zadeklarować funkcję jak

-(IBAction)clear:(id)sender;

dołączyć tę funkcję do Twoje zdarzenie na przyłożenie twojego UITextField.

w pliku .m

-(IBAction)clear:(id)sender 

{ 
    [email protected]""; 
} 
3

Należy również sprawdzić, czy tekst złożony jest pusta następnie należy umieścić uchwyt miejsce ponownie

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

Rozwiązanie dostarczone przez Matthias Bauch działa dobrze, ale co dzieje się, gdy masz się martwić o więcej niż jeden znak? Teraz musisz określić, które UITextField jest określane w textFieldDidEndEditing:textField (prawdopodobnie za pomocą właściwości znacznika), a to skutkuje bardziej niepotrzebnym kodem i logiką.

O wiele prostsze rozwiązanie: po prostu przypisz wyraźny kolor do tekstu zastępczego, a po zakończeniu edycji powróć do oryginalnego koloru. W ten sposób twój textFieldDidEndEditing:textField nie musi identyfikować textField, aby przywrócić odpowiedni tekst po unieważnieniu, tak jak w rozwiązaniu Baucha.

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

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

Może to spowodować odrzucenie sklepu z aplikacjami z powodu używania prywatnego interfejsu API – Hellojeffy

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

textfield delegat uczynić wartość uchwytu miejsce do zera

0

Rozwiązanie @etayluz „S jest lepsze (moim zdaniem), ponieważ nie trzeba się martwić o przypisywaniu tekstu placeholder'a ponownie . Jeśli masz niestandardowych pól tekstowych w różnych miejscach aplikacji i chcę, żeby zachowywać się równie (jak muszę w moim przypadku) można dodać ten kod do klasy niestandardowego textField za:

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

Ale jeśli musisz mieć specyficzne metody UITextFieldDelegate jest do indywidualnego textField trzeba zrobić, aby wdrożyć tę logikę do niego indywidualnie:

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

W przypadku SWIFT 3 lub później

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

func textFieldDidEndEditing(_ textField: UITextField) { 
    textField.placeholder = "Text Placeholder" 
} 
Powiązane problemy