How do you use NSAttributedString?

ios, ios4, nsattributedstring, textcolor

Solution

When building attributed strings, I prefer to use the mutable subclass, just to keep things cleaner.

That being said, here's how you create a tri-color attributed string:

NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:@"firstsecondthird"];
[string addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(0,5)];
[string addAttribute:NSForegroundColorAttributeName value:[UIColor greenColor] range:NSMakeRange(5,6)];
[string addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:NSMakeRange(11,5)];

typed in a browser. caveat implementor

Obviously you're not going to hard-code in the ranges like this. Perhaps instead you could do something like:

NSDictionary *wordToColorMapping = ....;  //an NSDictionary of NSString => UIColor pairs
NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:@""];
for (NSString *word in wordToColorMapping) {
  UIColor *color = [wordToColorMapping objectForKey:word];
  NSDictionary *attributes = [NSDictionary dictionaryWithObject:color forKey:NSForegroundColorAttributeName];
  NSAttributedString *subString = [[NSAttributedString alloc] initWithString:word attributes:attributes];
  [string appendAttributedString:subString];
  [subString release];
}

//display string

Problem

Multiple colours in an `NSString` or `NSMutableStrings` are not possible. So I've heard a little about the `NSAttributedString` which was introduced with the iPad SDK 3.2 (or around 3.2) and is available on the iPhone as of iPhone SDK 4.0 beta. I would like to have a string that has three colours. The reason I don't use 3 separate NSStrings, is because the length of each of the three `NSAttributedString` substrings changes often and so I would prefer, not to use any calculations to re-position 3 separate `NSString` objects. If it's possible using `NSAttributedString` how do I make the following - (if not possible with NSAttributed string how would you do it): Edit: Remember, `@"first"`, `@"second"` and `@"third"` will be replaced by other strings at any time. So using hardcoded NSRange values won't work.

Original source

Related problems