16

I have a UITextField with a placeholder. When the user wants to submit the form and he/she hasn't typed anything in the textfield, I would like the placeholder's text color become red. Here are my questions:

  • Would that go against Apple's User interface guidelines? I don't want my app to be rejected because of such small detail.
  • How I would do it?

I know I can override the method drawPlaceholderInRect: in a subclass of UITextField. But if I did this, the text would be always red and as I wrote before, I would like it to become red depending on a user defined action.

The only solution I can think of is to use a "default" text for my UITextField (the placeholder's text), display it in light grey as long as the user hasn't typed anything and display it in red when I need it. In other words, I would just mock the placeholder's behavior. But of course, this is not very elegant.

Any ideas?

8 Answers 8

49

Just look at this:

Digdog Dig - Change UITextField’s placeholder color without subclassing it

[self.MyTextField setValue:[UIColor darkGrayColor] forKeyPath:@"_placeholderLabel.textColor"]; 
Sign up to request clarification or add additional context in comments.

4 Comments

Simple solution for an attribute that should be changeable in Xcode, thank you!
Oddly enough it is important to note that this must be set after setting the placeholder text itself or the change doesn't take effect.
This might work for now, but keep in mind that because this is not public API, it might change without notice. Apple could also reject this for using private API.
This solution should absolutely not be marked as the answer because what Bob mentiod, it is part of the private functions/values and your app can be rejected for this. You should never use private api's unless you are not going to distribute via the app store.
26

You can Change the Placeholder textcolor to any color by using the below code. Just try this.

UIColor *color = [UIColor lightTextColor]; YOURTEXTFIELD.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"PlaceHolder Text" attributes:@{NSForegroundColorAttributeName: color}]; 

1 Comment

Seriously this should be the accepted answer for everything forever. Why EVER do anything else?
12

like the answer from verklixt but without accessing private api and using UIAppearance:

[[UILabel appearanceWhenContainedIn:[UITextField class], nil] setTextColor:[UIColor darkGrayColor]]; 

(tested on 5.0 through 7.1)

5 Comments

Works perfectly. Also, Apple shouldn't reject it because it's not private is it?
adam: yes, they should not reject this because non of this is undocumented.
Only works if you have one field in your view. When the textfield looses focus, the text will also be set to the placeholder color which may not be desirable.
Best Way!! Works perfect with me.
As Imran points out, the consequence of this technique is that the text uses the placeholder color when the text field loses focus. So using attributedPlaceholder works much better.
5

We can gain access to place holder label using key path,so that we can change color i.e.:

[self.textField setValue:[UIColor **"your color"**] forKeyPath:@"_placeholderLabel.textColor"]; 

1 Comment

This one is my favorite answer.
5

You can set the placeholder text as a NSAttributedString using this property

NSAttributedString *coloredPlaceholder = [[NSAttributedString alloc] initWithString:@"I am a placeholder string" attributes:@{NSForegroundColorAttributeName: [UIColor redColor]}]; [self.textField setAttributedPlaceholder:coloredPlaceholder]; 

Comments

4

override

-(void) drawPlaceholderInRect:(CGRect)rect { [[UIColor darkGrayColor] setFill]; [[self placeholder] drawInRect:rect withFont:[UIFont fontWithName:@"Helvetica-Oblique" size:15.0]]; } 

1 Comment

The OP explicitly says they don't want to override drawPlaceholderInRect:.
3

when user does not write any thing in textfield. then put this text as a textfield.text text and change font color.

4 Comments

Which text? The placeholder text?
yes, just write the placeholder text as a normal text in textfield.
Well, it's not what I expected but that will surely work. Thanks!
I must say I don't like this kind of gotcha's, because You have to do more code by implementing the placeholder behavior and you always have to keep in mind the .text is not nil (and check if it's equal to default text, etc., etc.). What about subclassing as strave mentioned, but making the placeholder fill color depending on some variable, for example showRequired, and in setter setShowRequired: call [self setNeedsDisplay];, which would automaticaly do the redrawing of placeholder (self.showRequired?[[UIColor redColor] setFill]:[[UIColor grayColor] setFill])?
0

I had some difficulty implementing color change of placeholder, instead I've found another solution which works perfectly for me.

//On button action change color to red -(void)btnAction { // authentication for missing textfields if ([textField_firstName.text isEqualToString:@""]) { textField_firstName.textColor=[UIColor redColor]; textField_firstName.text=@"Enter First Name"; } } // in the delegate method of UITextField change the following - (void)textFieldDidBeginEditing:(UITextField *)textField { //match the following string with above string and change the string to empty string on textfield click if ([textField_firstName.text isEqualToString:@"Enter First Name" ]) { textField_firstName.text=@""; } //change back to the text color you use textField_firstName.textColor=[UIColor blackColor]; } 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.