![](/img/trans.png)
[英]Tap on UITextField's clear button hides keyboard instead of clearing text
[英]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.