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

时间:2015-07-08 15:19:37

标签: objective-c macos cocoa interface-builder nstextfield

我目前遇到的问题类似于此SO question中描述的问题(目前尚未接受答案),因为我的文字字段是'除非选择了文本字段,否则占位符文本不可见。

我已经将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中的文本字段的类设置为CustomTextField,并设置占位符文本,如下所示:

enter image description here

从下面的屏幕截图中可以看出,占位符文本仅在选择了文本字段时才可见...

文字字段一:

enter image description here

文字字段二: enter image description here

是否有人知道如何使占位符文本可见,无论用户是否选择了它?谢谢!

1 个答案:

答案 0 :(得分:2)

在超类绘制其内容后,您正在绘制背景图像。所以,你可能正在绘制超类绘制的任何东西,取而代之。

在调用super之前,你应该首先绘制你的背景图像。此外,您不应该在-drawRect:中锁定焦点(或将其解锁)。框架已经为你完成了。

当文本字段具有焦点时,占位符显示的原因是您实际上看到的是字段编辑器,而不是此时的文本字段。字段编辑器是NSTextView(“视图”,而不是“字段”)的实例,它插入到文本字段顶部的视图层次结构中以处理文本编辑任务。因此,当文本字段具有焦点时,您的自定义类将其绘制为无关紧要。