Как раскрасить ввод в NSTextField с помощью NSFormatter? - PullRequest
2 голосов
/ 27 декабря 2011

Я хочу раскрасить первый символ во входной строке.Это можно легко сделать с помощью метода делегата controlDidChange.Но после добавления средства форматирования с помощью:

[field setFormatter:[[MyFormatter alloc] init]];

NSTextField игнорирует любые присвоенные ему приписанные строки.

Просмотр в документации Apple дал мне метод

- (NSAttributedString *)attributedStringForObjectValue:(id)anObjects withDefaultAttributes:(NSDictionary *)aDict

, но этометод никогда не вызывается: (

AppDelegate.h

@interface AppDelegate : NSObject <NSApplicationDelegate, NSTextFieldDelegate>
{
    IBOutlet NSTextField *field;
}
@property (assign) IBOutlet NSWindow *window;            
@end

AppDelegate.m

#import "AppDelegate.h"
#import "MyFormatter.h"

@implementation AppDelegate

@synthesize window = _window;

- (void)dealloc
{
    [super dealloc];
}

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

    [field setAttributedStringValue:[[NSAttributedString alloc] initWithString:@""]];
    [field setAllowsEditingTextAttributes:YES];
    [field setDelegate:self];
    [field setFormatter:[[MyFormatter alloc] init]];
}

- (void)controlTextDidChange:(NSNotification *)obj
{  
    NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:[field stringValue]];
    [string addAttribute:NSForegroundColorAttributeName value:[NSColor redColor] range:NSMakeRange(0,1)];
    [field setAttributedStringValue:string];
}

@end

MyFormatter.h

#import <Foundation/Foundation.h>

@interface MyFormatter : NSFormatter 
- (NSAttributedString *)attributedStringForObjectValue:(id)anObjects withDefaultAttributes:(NSDictionary *)aDict;
@end

MyFormatter.m

#import "MyFormatter.h"

@implementation MyFormatter

- (NSString *)stringForObjectValue:(id)obj
{
    return [(NSAttributedString *)obj string];
}

- (BOOL)getObjectValue:(id *)anObject forString:(NSString *)string errorDescription:(NSString **)error
{
    *anObject = [[[NSMutableAttributedString alloc] initWithString:string] autorelease];
    return YES;
}

- (NSAttributedString *)attributedStringForObjectValue:(id)anObjects withDefaultAttributes:(NSDictionary *)aDict
{
    NSLog(@"This method is never called :(");
    return nil;
}

@end

1 Ответ

0 голосов
/ 11 ноября 2017

Это не так, как это работает.Вы должны установить objectValue, и средство форматирования преобразует его в атрибутную строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...