在Xcode4中,我为UITextField创建了一些占位符文本,我希望它能清除用户点击框中的内容。
因此,在文本字段的属性检查器中,我单击了“编辑开始时清除”但是当我点击文本框时它不会立即删除文本(它只在您开始输入时消失)。
有没有办法在点击文本框时立即删除占位符文本?
答案 0 :(得分:67)
使您的ViewController成为textField的委托,并实现这两个方法:
- (void)textFieldDidBeginEditing:(UITextField *)textField {
textField.placeholder = nil;
}
- (void)textFieldDidEndEditing:(UITextField *)textField {
textField.placeholder = @"Your Placeholdertext";
}
答案 1 :(得分:8)
Matthias Bauch提供的解决方案运作良好,但是当您有多个UITextField
需要担心时会发生什么?现在,您必须确定UITextField
中引用的textFieldDidEndEditing:textField
(可能使用标记属性),这会导致更多不必要的代码和逻辑。
一个更简单的解决方案:只需为占位符文本指定一个清晰的颜色,完成编辑后,还原为原始颜色。通过这种方式,您的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"];
}
答案 2 :(得分:3)
您还应该检查文本是否为空,然后您应该再次放置占位符
- (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 :(得分:1)
使用此.. ..
- (void)textFieldDidBeginEditing:(UITextField *)textField{
textField.placeholder=nil;
}
不要忘记将文本字段的委托添加到文件所有者。
答案 4 :(得分:1)
如果您有多个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
}
}
答案 5 :(得分:0)
在你的.h文件中声明一个类似
的函数 -(IBAction)clear:(id)sender;
将此功能附加到UITextField
的触地事件中。
-(IBAction)clear:(id)sender
{
myplaceHolderText.text=@"";
}
答案 6 :(得分:0)
- (void)textFieldDidBeginEditing:(UITextField *)textField{
textField.placeholder=nil;
}
textfield delegate将占位符值设为nil
答案 7 :(得分:0)
@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")
}
}
答案 8 :(得分:0)
如果 SWIFT 3或更高版本
func textFieldDidBeginEditing(_ textField: UITextField) {
textField.placeholder = nil
}
func textFieldDidEndEditing(_ textField: UITextField) {
textField.placeholder = "Text Placeholder"
}
答案 9 :(得分:-1)
按钮操作事件放入此代码:
txtName.placeholder = @"";