web-dev-qa-db-ja.com

タップでUITextFieldプレースホルダーテキストをクリア

Xcode4では、UITextFieldのプレースホルダーテキストをいくつか作成しました。ユーザーがボックスをタップしたときにそれをクリアしたいのですが。

したがって、テキストフィールドの属性インスペクターで[編集の開始時にクリア]をクリックしましたが、テキストボックスをタップしてもすぐにはテキストが削除されません(入力を開始したときにのみ非表示になります)。

テキストボックスをタップするとすぐにプレースホルダーテキストを削除する方法はありますか?

22
Snowcrash

viewControllerをtextFieldのデリゲートにして、次の2つのメソッドを実装します。

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

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

Matthias Bauchが提供するソリューションはうまく機能しますが、複数のUITextFieldを心配する場合はどうなりますか?次に、UITextFieldtextFieldDidEndEditing:textFieldでどのように参照されているかを特定する必要があり(おそらくタグプロパティを使用)、その結果、不要なコードとロジックが発生します。

はるかに簡単な解決策:プレースホルダーテキストに明確な色を割り当て、編集が完了したら、元の色に戻します。このように、バウフのソリューションのように無効化された後、対応するテキストを元に戻すためにtextFieldDidEndEditing:textFieldtextFieldを識別する必要はありません。

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

複数の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
    }
}
2
Ammar

これを使って..

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

テキストフィールドのデリゲートをファイルの所有者に追加することを忘れないでください。

1

@etayluzのソリューションの方が優れています(私の意見)。これは、プレースホルダーにテキストを再度割り当てることを心配する必要がないためです。アプリのさまざまな場所にカスタムtextFieldがあり、それらが(私の場合は必要に応じて)等しく動作するようにしたい場合は、このコードをカスタム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")
    }
}
0
Yurii Koval

.hファイルで次のような関数を宣言します

-(IBAction)clear:(id)sender;

この関数をUITextFieldのタッチダウンイベントにアタッチします。

.mファイル

 -(IBAction)clear:(id)sender 

{
   myplaceHolderText.text=@"";
 }
0

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

テキストフィールドデリゲートはプレースホルダーの値をnilにします

0
chaithraVeeresh