Yet another small useful collection of small code snippets for NSString.
General
- ‘join’ an array of strings into a single string
[sourcecode]NSArray *chunks = … get an array, say by splitting it;
string = [chunks componentsJoinedByString: @" /// "];[/sourcecode]
would produce something like
[sourcecode lang=’c’]oop /// ack /// bork /// greeble /// ponies[/sourcecode] - ‘split’ a string into an array
[sourcecode] NSString *string = @"oop:ack:bork:greeble:ponies";
NSArray *chunks = [string componentsSeparatedByString: @":"];[/sourcecode] - Converting string to an integer
[sourcecode]
NSString *string = …;
int value = [string intValue];
[/sourcecode]
Similarly, there is afloatValue
anddoubleValue
NSString
methods. - Iterating attributes in an attributed string
This prints out each of the attribute runs from an attributed string:
[sourcecode lang=’c’]- (void) iterateAttributesForString: (NSAttributedString *) string
{
NSDictionary *attributeDict;
NSRange effectiveRange = { 0, 0 };do {
NSRange range;
range = NSMakeRange (NSMaxRange(effectiveRange),
[string length] – NSMaxRange(effectiveRange));attributeDict = [string attributesAtIndex: range.location
longestEffectiveRange: &effectiveRange
inRange: range];NSLog (@”Range: %@ Attributes: %@”,
NSStringFromRange(effectiveRange), attributeDict);} while (NSMaxRange(effectiveRange) < [string length]); } // iterateAttributesForString[/sourcecode]
- Making localizable strings
You will need a file namedLocalizable.strings
that lives in yourEnglish.lproj
directory (or whatever localization directory is appropriate). It has this syntax:
[sourcecode lang=’c’]”BorkDown” = “BorkDown”;
“Start Timer” = “Start Timer”;
“Stop Timer” = “Stop Timer”;[/sourcecode]
That is, a key followed by a localized value.In your code, you can then useNSLocalizedString()
or one of its variants:
[sourcecode lang=’c’] [statusItem setTitle: NSLocalizedString(@”BorkDown”, nil)];[/sourcecode]
The second argument is ignored by the function. Obstensively it is a/* comment */
in the strings file so that you can match the key back to what it is supposed to actually be. - NSLog without the extra crud
NSlog
puts too much crud in front of the logging line. For a foundation tool that output stuff, it gets in the way. I’d still like for a replacement to expand%@
, which theprintf()
family won’t do. Here’s a some code that’ll do that.
[sourcecode lang=’c’]#includevoid LogIt (NSString *format, …)
{
va_list args;va_start (args, format);
NSString *string;
string = [[NSString alloc] initWithFormat: format arguments: args];
va_end (args);
printf (“%s\n”, [string cString]);
[string release];
} // LogIt[/sourcecode]
- Putting an image into an attributed string
You’ll need to use a text attachment.
[sourcecode lang=’c’]- (NSAttributedString *) prettyName
{
NSTextAttachment *attachment;
attachment = [[[NSTextAttachment alloc] init] autorelease];
NSCell *cell = [attachment attachmentCell];NSImage *icon = [self icon]; // or wherever you are getting your image
[cell setImage: icon];NSString *name = [self name];
NSAttributedString *attrname;
attrname = [[NSAttributedString alloc] initWithString: name];NSMutableAttributedString *prettyName;
prettyName = (id)[NSMutableAttributedString attributedStringWithAttachment:
attachment]; // cast to quiet compiler warning
[prettyName appendAttributedString: attrname];return (prettyName);
} // prettyName[/sourcecode]
This puts the image at the front of the string. To put the image in the middle of the string, you’ll need to create an attributedstring with attachment, and then append that to your final attributed string. - Stripping out newlines from a string
So you have an NSString and want to yank out the newlines. You can do a split and join, like in scripting languages, or you can make a mutable copy and manipulate that:
[sourcecode lang=’c’] NSMutableString *mstring = [NSMutableString stringWithString:string];
NSRange wholeShebang = NSMakeRange(0, [mstring length]);[mstring replaceOccurrencesOfString: @”
”
withString: @””
options: 0
range: wholeShebang];return [NSString stringWithString: mstring];[/sourcecode]
(this can also be used for generic string manipulations, not just stripping out newlines).This technique takes half the time (at least) of split/join. But probably not enough to make an impact. In a simple test, split/join took 0.124 seconds to strip 36909 newlines in a 1.5 meg textfile, and 0.071 seconds to do the same. - Substring matching
NSRange range = [[string name] rangeOfString: otherString options: NSCaseInsensitiveSearch];
- Today’s date as a string
The general solution for converting a date to a string is NSDateFormatter. Sometimes you need to generate a date string in a particular format easily. For instance if you need “December 4, 2007″, you can use:
[sourcecode lang=’c’][[NSDate date] descriptionWithCalendarFormat: @”%B %e, %Y” timeZone: nil locale: nil][/sourcecode]
(Thanks to Mike Morton for this one) - Trimming whitespace from ends of a string
[sourcecode lang=’c’] NSString *ook = @”\n \t\t hello there \t\n \n\n”;
NSString *trimmed =
[ook stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];NSLog(@”trimmed: ‘%@'”, trimmed);[/sourcecode]
produces
[sourcecode lang=’c’]2009-12-24 18:24:42.431 trim[6799:903] trimmed: ‘hello there'[/sourcecode]
Graphics
- Draw a string in bold
[sourcecode lang=’c’]- (void) drawLabel: (NSString *) label
atPoint: (NSPoint) point
bold: (BOOL) bold {
NSMutableDictionary *attributes = [NSMutableDictionary dictionary];
NSFont *currentFont = [NSFont userFontOfSize: 14.0];if (bold) {
NSFontManager *fm = [NSFontManager sharedFontManager];
NSFont *boldFont = [fm convertFont: currentFont
toHaveTrait: NSBoldFontMask];
[attributes setObject: boldFont
forKey: NSFontAttributeName];
} else {
[attributes setObject: currentFont
forKey: NSFontAttributeName];
}[label drawAtPoint: point withAttributes: attributes];;
} // drawLabel[/sourcecode]
Random
- Put a string on the pasteboard
Here’s a category for easily putting a string on the paste|clipboard:
[sourcecode lang=’c’]
@implementation NSString (PasteboardGoodies)– (void) sendToPasteboard
{
[[NSPasteboard generalPasteboard]
declareTypes: [NSArray arrayWithObject: NSStringPboardType]
owner:nil];
[[NSPasteboard generalPasteboard]
setString: self
forType: NSStringPboardType];
} // sendToPasteboard@end // PasteboardGoodies[/sourcecode]