2010-06-24 52 views
9

試圖改變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 

回答

6

爲什麼不直接設置文本字段的field editor的屬性,直接在現場becomes first responder

在一個典型的文本字段,選擇在該字段爲第一響應者才能看到,所以如果你問文本字段的字段編輯器,然後設置所選文本的屬性,你會得到相同的影響,止跌你呢?

NSDictionary * attributes = [NSDictionary dictionaryWithObjectsAndKeys: 
    [NSColor orangeColor], NSBackgroundColorAttributeName, nil]; 
NSTextView * fieldEditor = (NSTextView *)[[self window] fieldEditor:YES 
    forObject:textField]; 
[fieldEditor setSelectedTextAttributes:attributes]; 

注:正如下面的評論中討論,該文件是在說字段編輯器是NSTextView的實例正確的,但是 - [NSWindow fieldEditor:forObject:]方法聲稱返回NSText( NSTextView的直接超類)。如果您打算髮送字段編輯器NSTextView-only方法,則需要將其轉換爲NSTextView以清除編譯器的警告。如果方法原型未來可以修正,那麼鑄造不會破壞代碼中的任何內容,因此可以安全地將其保留原位。

+0

看看另一個問題的答案。它顯示瞭如何操作NSTokenField的字段編輯器(它是NSTextField的一個子類,所以它的工作方式完全相同)。 http://stackoverflow.com/questions/2995205/prevent-selecting-all-tokens-in-nstokenfield – 2010-06-24 17:50:43

+0

文本字段的字段編輯器是一個NSText對象,並且該類也沒有setSelectedTextAttributes方法。除非我錯過了某些東西,否則似乎不能這樣做。 – hasvn 2010-06-24 17:53:55

+0

@hasvn:這很混亂......'[NSWindow fieldEditor:forObject:]'的原型表示它返回NSText *',但文檔說該字段編輯器是一個NSTextView對象。 – JWWalker 2010-06-24 18:03:45

相關問題