it-roy-ru.com

Очистить UITextField Placeholder текст на кран

В Xcode4 я создал некоторый текст-заполнитель для UITextField, и мне бы хотелось, чтобы он был очищен, когда пользователь нажимает на поле.

Итак, в Инспекторе Атрибутов для текстового поля я нажал «Очистить, когда начинается редактирование», однако это не приводит к немедленному удалению текста, когда я нажимаю в текстовом поле (он исчезает только тогда, когда вы начинаете печатать).

Есть ли способ удалить текст заполнителя сразу после нажатия на текстовое поле? 

21
Snowcrash

сделайте ваш ViewController делегатом textField и реализуйте эти два метода:

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

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

Решение, предложенное Матиасом Баухом, работает хорошо, но что происходит, когда у вас есть несколько UITextField для беспокойства? Теперь вы должны определить, какой UITextField упоминается в textFieldDidEndEditing:textField (возможно, с помощью свойства tag), и это приводит к большему количеству ненужного кода и логики.

Гораздо более простое решение: просто назначьте чистый цвет для текста заполнителя, а когда закончите редактирование, вернитесь к его первоначальному цвету. Таким образом, ваш textFieldDidEndEditing:textField не должен идентифицировать textField, чтобы вернуть соответствующий текст после того, как он был аннулирован, как в решении 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

Вы также должны проверить, является ли текстовое поле пустым, тогда вы должны снова поместить заполнитель

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

использовать этот..

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

не забудьте добавить делегата для текстового поля в ваш файл Owner.

1
Ankit Srivastava

Если у вас есть более одного TextField

1) Добавить строковую переменную в ваш класс

class YourViewController : UIViewController {

var placeHolder = ""

2) Добавить 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

Решение @etayluz лучше (мое мнение), потому что вам не нужно беспокоиться о повторном назначении текста placeholder'a ........ Если у вас есть собственные текстовые поля в разных местах вашего приложения и вы хотите, чтобы они вели себя одинаково ( как мне нужно в моем случае) вы можете добавить этот код в свой класс TextField:

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

Но если вам нужно иметь определенные методы UITextFieldDelegate для отдельного textField, вам НЕОБХОДИМО реализовать эту логику для него индивидуально:

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

В вашем .h файле объявите функцию вроде

-(IBAction)clear:(id)sender;

прикрепите эту функцию к вашему событию приземления вашей UITextField.

в вашем .m файле

 -(IBAction)clear:(id)sender 

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

В случае Swift 3 или более поздней версии

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

делегат текстового поля делает значение заполнителя равным нулю

0
chaithraVeeresh