Xcode4では、UITextFieldのプレースホルダーテキストをいくつか作成しました。ユーザーがボックスをタップしたときにそれをクリアしたいのですが。
したがって、テキストフィールドの属性インスペクターで[編集の開始時にクリア]をクリックしましたが、テキストボックスをタップしてもすぐにはテキストが削除されません(入力を開始したときにのみ非表示になります)。
テキストボックスをタップするとすぐにプレースホルダーテキストを削除する方法はありますか?
viewControllerをtextFieldのデリゲートにして、次の2つのメソッドを実装します。
- (void)textFieldDidBeginEditing:(UITextField *)textField {
textField.placeholder = nil;
}
- (void)textFieldDidEndEditing:(UITextField *)textField {
textField.placeholder = @"Your Placeholdertext";
}
Matthias Bauchが提供するソリューションはうまく機能しますが、複数のUITextField
を心配する場合はどうなりますか?次に、UITextField
がtextFieldDidEndEditing:textField
でどのように参照されているかを特定する必要があり(おそらくタグプロパティを使用)、その結果、不要なコードとロジックが発生します。
はるかに簡単な解決策:プレースホルダーテキストに明確な色を割り当て、編集が完了したら、元の色に戻します。このように、バウフのソリューションのように無効化された後、対応するテキストを元に戻すためにtextFieldDidEndEditing:textField
がtextField
を識別する必要はありません。
- (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)クラスに文字列変数を追加する
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;
}
テキストフィールドのデリゲートをファイルの所有者に追加することを忘れないでください。
@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")
}
}
.hファイルで次のような関数を宣言します
-(IBAction)clear:(id)sender;
この関数をUITextField
のタッチダウンイベントにアタッチします。
.mファイル
-(IBAction)clear:(id)sender
{
myplaceHolderText.text=@"";
}
Swift 3以降の場合
func textFieldDidBeginEditing(_ textField: UITextField) {
textField.placeholder = nil
}
func textFieldDidEndEditing(_ textField: UITextField) {
textField.placeholder = "Text Placeholder"
}
- (void)textFieldDidBeginEditing:(UITextField *)textField{
textField.placeholder=nil;
}
テキストフィールドデリゲートはプレースホルダーの値をnilにします