2011-12-16 32 views
21

Trong Xcode4, tôi đã tạo một số văn bản giữ chỗ cho một UITextField và tôi muốn nó rõ ràng khi người dùng gõ vào hộp. Vì vậy, trong Thanh tra thuộc tính cho trường văn bản tôi đã nhấp vào "Xóa khi chỉnh sửa bắt đầu", tuy nhiên điều này không ngay lập tức xóa văn bản khi tôi nhấn vào hộp văn bản (nó chỉ biến mất khi bạn bắt đầu nhập).Xóa văn bản giữ chỗ UITextField trên tap

Có cách nào để xóa văn bản trình giữ chỗ ngay lập tức khi nhấn vào hộp văn bản không?

Trả lời

67

làm ViewController bạn các đại biểu của TextField và thực hiện hai phương pháp:

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

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

Trong phương pháp thứ hai, bạn phải kiểm tra xem trường văn bản có giá trị rỗng hay không? – KingofBliss

+4

không. Văn bản trình giữ chỗ không hiển thị nếu có văn bản "thông thường". –

+0

Oh .. Vâng tôi quên .. :) Cảm ơn bạn đã thông tin .. – KingofBliss

1

sử dụng này ..

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

đừng quên để thêm các đại biểu cho textfield để Chủ đầu tư tập tin của bạn.

-1

trên sự kiện Nút hành động đưa luật này:

txtName.placeholder = @""; 
0

Trong file .h của bạn khai báo một chức năng như

-(IBAction)clear:(id)sender;

đính kèm chức năng này vào sự kiện chạm của bạn trên số UITextField.

trong file .m bạn

-(IBAction)clear:(id)sender 

{ 
    [email protected]""; 
} 
3

Bạn cũng nên kiểm tra xem văn bản đệ trình là rỗng thì bạn nên đặt giữ chỗ một lần nữa

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

Các giải pháp được cung cấp bởi Matthias Bauch hoạt động tốt, nhưng những gì xảy ra khi bạn có nhiều hơn UITextField để lo lắng? Bây giờ bạn phải xác định xem UITextField nào được đề cập đến trong textFieldDidEndEditing:textField (có thể do sử dụng thuộc tính thẻ) và điều đó dẫn đến mã và logic không cần thiết hơn.

Một giải pháp đơn giản hơn nhiều: chỉ cần gán màu rõ ràng cho văn bản trình giữ chỗ và khi chỉnh sửa xong, hãy hoàn nguyên về màu gốc của nó. Bằng cách này, textFieldDidEndEditing:textField của bạn không phải xác định textField để đặt lại văn bản tương ứng sau khi đã được vô hiệu hóa như trong giải pháp của Bauch.

- (void)textFieldDidBeginEditing:(UITextField *)textField { 
    [textField setValue:[UIColor clearColor] forKeyPath:@"_placeholderLabel.textColor"]; 
} 

- (void)textFieldDidEndEditing:(UITextField *)textField { 
    [textField setValue:[UIColor placeholderColor] forKeyPath:@"_placeholderLabel.textColor"]; 
} 
+0

Điều này có thể khiến ứng dụng từ chối ứng dụng để sử dụng API riêng tư – Hellojeffy

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

textfield đại biểu làm cho giá trị giữ chỗ để nil

0

giải pháp Các @etayluz 's là tốt hơn (quan điểm của tôi), bởi vì bạn không cần phải lo lắng về việc gán văn bản placeholder'a lại . Nếu bạn có textfields tùy chỉnh ở những nơi khác nhau của ứng dụng của bạn và muốn họ cư xử như nhau (như tôi cần trong trường hợp của tôi), bạn có thể thêm mã này vào lớp TextField tùy chỉnh của bạn:

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

Nhưng nếu bạn cần phải có phương pháp cụ thể UITextFieldDelegate cho TextField cá nhân bạn cần phải thực hiện logic này cho nó riêng lẻ:

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

trong trường hợp SWIFT 3 hay muộn

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

func textFieldDidEndEditing(_ textField: UITextField) { 
    textField.placeholder = "Text Placeholder" 
} 
Các vấn đề liên quan