試圖改變NSTextField的選定文本背景顏色(我們有一個黑暗的UI,選定的文本背景與文本本身幾乎相同),但只有NSTextView似乎允許我們改變這一點。使用NSTextView僞造NSTextField以獲得更好的着色?
所以我們試圖使用NSTextView僞造NSTextField,但無法使文本滾動工作相同。
我們得到的最接近的是與此代碼:
NSTextView *tf = [ [ NSTextView alloc ] initWithFrame: NSMakeRect(30.0, 20.0, 80.0, 22.0) ];
// Dark UI
[tf setTextColor:[NSColor whiteColor]];
[tf setBackgroundColor:[NSColor darkGrayColor]];
// Fixed size
[tf setVerticallyResizable:FALSE];
[tf setHorizontallyResizable:FALSE];
[tf setAlignment:NSRightTextAlignment]; // Make it right-aligned (yup, we need this too)
[[tf textContainer] setContainerSize:NSMakeSize(2000, 20)]; // Try to Avoid line wrapping with this ugly hack
[tf setFieldEditor:TRUE]; // Make Return key accept the textfield
// Set text properties
NSMutableDictionary *dict = [[[tf selectedTextAttributes] mutableCopy ] autorelease];
[dict setObject:[NSColor orangeColor] forKey:NSBackgroundColorAttributeName];
[tf setSelectedTextAttributes:dict];
這工作幾乎沒事,只是如果文本比文本框更長的時間,你不能滾動到以任何方式。
任何想法如何做到這一點?
在此先感謝
編輯:解決方案通過Joshua Nozzi
由於約書亞以下建議,這是一個很好的解決方案是什麼我一直在尋找:
@interface ColoredTextField : NSTextField
- (BOOL)becomeFirstResponder;
@end
@implementation ColoredTextField
- (BOOL)becomeFirstResponder
{
if (![super becomeFirstResponder])
return NO;
NSDictionary * attributes = [NSDictionary dictionaryWithObjectsAndKeys :
[NSColor orangeColor], NSBackgroundColorAttributeName, nil];
NSTextView * fieldEditor = (NSTextView *)[[self window] fieldEditor:YES forObject:self];
[fieldEditor setSelectedTextAttributes:attributes];
return YES;
}
@end
而不是僞造它帶有一個NSTextView,它只是一個NSTextField,當它成爲第一響應者時,它改變所選的文本顏色。
編輯:一旦您在文本框中按Enter鍵,上面的代碼將回退到默認選擇顏色。這是避免這種情況的一種方法。
@interface ColoredTextField : NSTextField
- (BOOL)becomeFirstResponder;
- (void)textDidEndEditing:(NSNotification *)notification;
- (void)setSelectedColor;
@end
@implementation ColoredTextField
- (BOOL)becomeFirstResponder
{
if (![super becomeFirstResponder])
return NO;
[self setSelectedColor];
return YES;
}
- (void)textDidEndEditing:(NSNotification *)notification
{
[super textDidEndEditing:notification];
[self setSelectedColor];
}
- (void) setSelectedColor
{
NSDictionary * attributes = [NSDictionary dictionaryWithObjectsAndKeys :
[NSColor orangeColor], NSBackgroundColorAttributeName, nil];
NSTextView * fieldEditor = (NSTextView *)[[self window] fieldEditor:YES forObject:self];
[fieldEditor setSelectedTextAttributes:attributes];
}
@end
看看另一個問題的答案。它顯示瞭如何操作NSTokenField的字段編輯器(它是NSTextField的一個子類,所以它的工作方式完全相同)。 http://stackoverflow.com/questions/2995205/prevent-selecting-all-tokens-in-nstokenfield – 2010-06-24 17:50:43
文本字段的字段編輯器是一個NSText對象,並且該類也沒有setSelectedTextAttributes方法。除非我錯過了某些東西,否則似乎不能這樣做。 – hasvn 2010-06-24 17:53:55
@hasvn:這很混亂......'[NSWindow fieldEditor:forObject:]'的原型表示它返回NSText *',但文檔說該字段編輯器是一個NSTextView對象。 – JWWalker 2010-06-24 18:03:45