【问题标题】:Change text color of the active and non-active NSTextField更改活动和非活动 NSTextField 的文本颜色
【发布时间】:2012-02-06 02:49:20
【问题描述】:

我想在 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

【问题讨论】:

    标签: objective-c cocoa nstextfield nstextview


    【解决方案1】:

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

    您可以通过在窗口的委托中替换您自己的字段编辑器来做到这一点,如下所示:

    - (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;
    }
    

    【讨论】:

    • 所以我尝试将 -(id)windowWillReturnFieldEditor 代码放在我的 AppDelegate.m 中,但它似乎不起作用。我错过了什么吗?
    • 您必须通过在 xib 编辑器中连接它们来使 AppDelegate 成为窗口的委托。
    • 您的意思是从 NSTextField 拖到 AppDelegate 并选择“delegate”吗?如果是这样,我已经尝试过了。还是您的意思是从 Dock 中的“窗口”图标拖动到“AppDelegate”图标并选择“委托”?
    • 好吧,我搞定了。我必须将 #import"MyTextField.h" 添加到 AppDelegate.m 文件中。当我单击一个文本框时,它确实使文本颜色变为红色,并在该框不活动时变回黑色。但是,第一个文本框有一个奇怪的问题。当我输入一个数字时,它会输入到最后一个文本框中!我正在使用带有数字格式化程序的 NSTextFields。
    • 当我运行程序时,无论文本字段是第一响应者(第一个激活的),都是表现怪异的文本字段。例如,如果我在该字段中输入一个数字,那么我必须按两次“Tab”键,直到选择下一个文本字段。第一次按下“Tab”键时,输入将显示在下一个文本框中。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-03-17
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 2016-04-12
      • 1970-01-01
      • 2021-10-28
      相关资源
      最近更新 更多