更改活动和非活动NSTextField的文本颜色

时间:2012-02-06 02:49:20

标签: objective-c cocoa nstextfield nstextview

当NSTextField变为活动状态时,我想将文本颜色更改为“红色”。所有非活动文本字段都需要包含“黑色”文本。

使用becomeFirstResponder方法,我可以将文本颜色更改为“红色”。但是,当文本字段失去焦点时,文本颜色保持“红色”。一旦它是非活动的NSTextField,我需要将文本颜色更改回“黑色”。我尝试了resignFirstResponder方法,但它没有将文本颜色更改回“黑色”。

这是我的代码:

#import <Foundation/Foundation.h>

@interface MyTextField : NSTextField {
}

@end

#import "MyTextField.h"

@implementation MyTextField

- (BOOL)becomeFirstResponder {
    if (![super becomeFirstResponder]) {
        return NO;
    } else {
        [self setTextColor:[NSColor redColor]];
        return YES;
    }
}

- (BOOL)resignFirstResponder {
    if (![super resignFirstResponder]) {
        return NO;
    } else {
        [self setTextColor:[NSColor blackColor]];
        return YES;
    }
}

@end

2 个答案:

答案 0 :(得分:2)

我认为问题在于,当文本字段成为第一响应者时,字段编辑器将采用颜色属性,但是当文本字段重新占用时,它将替换它。您很可能希望直接更改字段编辑器上的属性。

您可以通过在窗口的委托中替换您自己的字段编辑器来执行此操作,如下所示:

- (id)windowWillReturnFieldEditor:(NSWindow *)sender toObject:(id)client {

    if ([client isKindOfClass:[MyTextField class]]) {

        static NSTextView *fieldEditor;

        if (nil == fieldEditor) {
            fieldEditor = [[NSTextView alloc] init];
            [fieldEditor setFieldEditor:YES];      
        }

        [fieldEditor setDelegate:client]; 
        [fieldEditor setTextColor:[NSColor redColor]];

        return fieldEditor;

    }
    else return nil;
}

答案 1 :(得分:1)

为什么不在-textDidEndEditing子类中添加方法NSTextField

- (void)textDidEndEditing:(NSNotification *)notification
{
    [self setTextColor:[NSColor blackColor]];
    [super textDidEndEditing:notification];
}