Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NSTextFieldCell with Multiple Lines

I need to show an NSTextFieldCell with multiple lines with different format on each line.

Something like this:

Line 1: Title
Line 2: Description

I subclassed NSTextFieldCell but I don't know how to go on with it.

Any ideas?

like image 486
mikywan Avatar asked Jul 01 '11 19:07

mikywan


1 Answers

First off, you don't have to subclass NSTextFieldCell to achieve this, since, as a subclass of NSCell, NSTextFieldCell inherits -setAttributedStringValue:. The string you provided can be represented as a NSAttributedString. The following code illustrates how you could achieve the desired text with an ordinary NSTextField.

MDAppController.h:

@interface MDAppController : NSObject <NSApplicationDelegate> {
    IBOutlet NSWindow *window;
    IBOutlet NSTextField *textField;
}

@end

MDAppController.m:

@implementation MDAppController

static NSDictionary *regularAttributes = nil;
static NSDictionary *boldAttributes = nil;
static NSDictionary *italicAttributes = nil;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {

    if (regularAttributes == nil) {
        regularAttributes = [[NSDictionary dictionaryWithObjectsAndKeys:
        [NSFont systemFontOfSize:[NSFont systemFontSize]],NSFontAttributeName,
                       nil] retain];

        boldAttributes = [[NSDictionary dictionaryWithObjectsAndKeys:
        [NSFont boldSystemFontOfSize:[NSFont systemFontSize]],NSFontAttributeName,
                  nil] retain];

        NSFont *regFont = [NSFont userFontOfSize:[NSFont systemFontSize]];
        NSFontManager *fontManager = [NSFontManager sharedFontManager];
        NSFont *oblique = [fontManager convertFont:regFont
                                       toHaveTrait:NSItalicFontMask];
        italicAttributes = [[NSDictionary dictionaryWithObjectsAndKeys:
              oblique,NSFontAttributeName, nil] retain];
    }


    NSString *string = @"Line 1: Title\nLine 2: Description";
    NSMutableAttributedString *rString =
    [[[NSMutableAttributedString alloc] initWithString:string] autorelease];

    [rString addAttributes:regularAttributes
                     range:[string rangeOfString:@"Line 1: "]];

    [rString addAttributes:regularAttributes
                     range:[string rangeOfString:@"Line 2: "]];
    [rString addAttributes:boldAttributes
                     range:[string rangeOfString:@"Title"]];

    [rString addAttributes:italicAttributes
                     range:[string rangeOfString:@"Description"]];

    [textField setAttributedStringValue:rString];
}
@end

This results in the following:

enter image description here

Now, depending on how you intend for this text to be used, you could implement the design in several different ways. You may want to look into whether an NSTextView might work for you rather than an NSTextField...

like image 101
NSGod Avatar answered Oct 07 '22 11:10

NSGod