清除UITextField占位符文本

时间:2011-12-16 10:31:14

标签: iphone uitextfield

在Xcode4中,我为UITextField创建了一些占位符文本,我希望它能清除用户点击框中的内容。

因此,在文本字段的属性检查器中,我单击了“编辑开始时清除”但是当我点击文本框时它不会立即删除文本(它只在您开始输入时消失)。

有没有办法在点击文本框时立即删除占位符文本?

10 个答案:

答案 0 :(得分:67)

使您的ViewController成为textField的委托,并实现这两个方法:

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

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

答案 1 :(得分:8)

Matthias Bauch提供的解决方案运作良好,但是当您有多个UITextField需要担心时会发生什么?现在,您必须确定UITextField中引用的textFieldDidEndEditing:textField(可能使用标记属性),这会导致更多不必要的代码和逻辑。

一个更简单的解决方案:只需为占位符文本指定一个清晰的颜色,完成编辑后,还原为原始颜色。通过这种方式,您的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"];
}

答案 2 :(得分:3)

您还应该检查文本是否为空,然后您应该再次放置占位符

- (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 :(得分:1)

使用此.. ..

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

不要忘记将文本字段的委托添加到文件所有者。

答案 4 :(得分:1)

如果您有多个TextField

1)将String变量添加到您的班级

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

答案 5 :(得分:0)

在你的.h文件中声明一个类似

的函数

-(IBAction)clear:(id)sender;

将此功能附加到UITextField的触地事件中。

你的.m文件中的

 -(IBAction)clear:(id)sender 

{
   myplaceHolderText.text=@"";
 }

答案 6 :(得分:0)

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

textfield delegate将占位符值设为nil

答案 7 :(得分:0)

@etayluz的解决方案更好(我的意见),因为您不必担心再次分配占位符'文本。 如果你的应用程序的不同位置有自定义textFields并希望它们的行为相同(在我的情况下我需要),你可以将此代码添加到自定义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")
    }
}

但是如果您需要为单个textField使用特定的UITextFieldDelegate方法,则需要为其单独实现此逻辑:

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

答案 8 :(得分:0)

如果 SWIFT 3或更高版本

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

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

答案 9 :(得分:-1)

按钮操作事件放入此代码:

txtName.placeholder = @"";