2013-03-05 82 views
2

我确实使用setPlaceholderAttributedString:NSTextFieldCell对象来设置自定义字体和颜色的占位符。这里是整个代码...NSTextField的单元格setPlaceholderAttributedString - 获取焦点时不显示占位符

_statusMessageField = [[NSTextField alloc] initWithFrame:NSZeroRect]; 
[_statusMessageField setBordered:NO]; 
[_statusMessageField setBezeled:NO]; 
[_statusMessageField setFocusRingType:NSFocusRingTypeNone]; 
[_statusMessageField setDrawsBackground:NO]; 
[_statusMessageField setTextColor:TM_NS_COLOR(35, 37, 46)]; 
[_statusMessageField setFont:[NSFont systemFontOfSize:13.0]]; 

NSMutableAttributedString *placeholder = [[NSMutableAttributedString alloc] initWithString:@"What's up?"]; 
NSRange range = NSMakeRange(0, [placeholder length]); 
[placeholder addAttribute:NSFontAttributeName value:[NSFont systemFontOfSize:13.0] range:range]; 
[placeholder addAttribute:NSForegroundColorAttributeName value:TM_NS_COLORA(92, 97, 114, 0.7) range:range]; 
[placeholder fixAttributesInRange:range]; 
[_statusMessageField.cell setPlaceholderAttributedString:placeholder]; 
_statusMessageField.translatesAutoresizingMaskIntoConstraints = NO; 
[self addSubview:_statusMessageField]; 

...它让我发疯,因为......

  • 占位符是只有NSTextField没有焦点可见,
  • 当我点击NSTextField,插入符是可见的,没有进入呢,但是占位符消失了,这是不对的,应该是可见的,直到输入至少一个字符,

...当我更换setPlaceholderAttributedString:setPlaceholderString:(没有归属),占位符行为正确 - 当NSTextField没有焦点或焦点没有输入时可见。

任何想法可能是错误的?

下面是图片http://d.pr/i/WoC9的链接,您可以在这里看到区别。

+0

你已经设置的帧大小为'NSZeroRect'? – trojanfoe 2013-03-05 10:20:29

+0

将TextField的文本设置为零或空字符串@“”将导致显示占位符文本。 NSTextFieldCell实现了setPlaceholderString,而NSTextField又有一个嵌入的NSTextFieldCell。我使用[textField setStringValue:@“”]将NSTextField的内容设置为空。 – parilogic 2013-03-05 10:22:55

+0

@trojanfoe是的,它通常是可见的,因为我确实使用自动布局约束。 – robertvojta 2013-03-05 10:27:14

回答

0

我认为你需要在NSTextField状态下勾选“拒绝First Responder”。

这将解决问题。

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    // Insert code here to initialize your application 
    [_statusMessageField setBordered:NO]; 
    [_statusMessageField setBezeled:NO]; 
    [_statusMessageField setFocusRingType:NSFocusRingTypeNone]; 
    [_statusMessageField setDrawsBackground:NO]; 
    [_statusMessageField setTextColor:[NSColor blueColor]]; 
    [_statusMessageField setFont:[NSFont systemFontOfSize:13.0]]; 

    NSMutableAttributedString *placeholder = [[NSMutableAttributedString alloc] initWithString:@"What's up?"]; 
    NSRange range = NSMakeRange(0, [placeholder length]); 
    [placeholder addAttribute:NSFontAttributeName value:[NSFont systemFontOfSize:13.0] range:range]; 
    [placeholder addAttribute:NSForegroundColorAttributeName value:[NSColor greenColor] range:range]; 
    [placeholder fixAttributesInRange:range]; 
    [_statusMessageField.cell setPlaceholderAttributedString:placeholder]; 
    _statusMessageField.translatesAutoresizingMaskIntoConstraints = NO; 
    [_statusMessageField setRefusesFirstResponder:NO]; 


} 

- (void)awakeFromNib { 

    [_statusMessageField setRefusesFirstResponder:YES]; 
} 

问候, 尼拉姆

+0

不,这并不能解决问题。而且我也不想拒绝第一响应者。 – robertvojta 2013-03-05 11:29:45

+0

但它适用于我。我用你的代码创建了新的项目。它适用于上述变化 – 2013-03-05 11:31:19

+0

但是当我设置拒绝第一响应者为YES时,文本字段不计入循环中,例如我可以通过Tab键在控件之间跳转,我不得不使用鼠标单击。 – robertvojta 2013-03-05 11:47:23