簡體   English   中英

清除UITextField占位符文本

[英]Clear UITextField Placeholder text on tap

在Xcode4中,我為UITextField創建了一些占位符文本,我希望它能清除用戶點擊框中的內容。

因此,在文本字段的屬性檢查器中,我單擊了“編輯開始時清除”但是當我點擊文本框時它不會立即刪除文本(它只在您開始鍵入時消失)。

有沒有辦法在文本框中點擊時立即刪除占位符文本?

使您的ViewController成為textField的委托並實現這兩個方法:

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

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

Matthias Bauch提供的解決方案運行良好,但是當您有多個UITextField需要擔心時會發生什么? 現在,您必須確定textFieldDidEndEditing:textField引用了哪個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"];
}

您還應該檢查文本是否為空,然后再次放置占位符

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

如果您有多個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
    }
}

用這個..

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

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

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

textfield delegate使占位符值為零

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

如果是SWIFT 3或更高版本

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

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

在.h文件中聲明一個類似的函數

-(IBAction)clear:(id)sender;

將此功能附加到UITextField觸地事件。

在.m文件中

 -(IBAction)clear:(id)sender 

{
   myplaceHolderText.text=@"";
 }

在按鈕動作事件中放置此代碼:

txtName.placeholder = @"";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM