NSTextView 占位符文本仅在选中时可见

NSTextView placeholder text only visible when selected

我目前遇到的问题类似于此 SO question 中描述的问题(目前没有公认的答案),因为我的文本字段的占位符文本不可见,除非文本字段是选择。

我有 subclassed NSTextField(代码如下):

@interface CustomTextField : NSTextField

@property (nonatomic, strong) IBInspectable NSImage *backgroundImage;

@end

@implementation CustomTextField

- (void)awakeFromNib
{
    [self setDrawsBackground:NO];
}

- (void)drawRect:(NSRect)rect
{
    NSImage *backgroundImage = self.backgroundImage;

    [super drawRect:rect];

    [self lockFocus];

    [backgroundImage drawInRect:rect fromRect:rect operation:NSCompositeSourceOver fraction:1.0];
    [self unlockFocus];
}

@end

我在 Interface Builder 中将文本字段的 class 设置为 CustomTextField,并设置占位符文本,如下所示:

如下面的屏幕截图所示,占位符文本仅在文本字段被选中时可见...

文本字段一:

文本域二:

有没有人知道如何使占位符文本可见,而不管用户是否选择它?谢谢!

您正在超级 class 绘制其内容后绘制背景图像。因此,您可能正在绘制 superclass 绘制的任何内容,替换它。

您应该先绘制背景图像,然后再调用 super。此外,您不应在 -drawRect: 中锁定(或解锁)焦点。这些框架已经为您做到了。

当您的文本字段获得焦点时占位符出现的原因是您实际上看到的是字段编辑器,而不是此时的文本字段。字段编辑器是 NSTextView("view",而不是 "field")的一个实例,它被插入到文本字段顶部的视图层次结构中以处理文本编辑任务。因此,当文本字段具有焦点时,您的自定义 class 绘制它无关紧要。