2014-07-06 33 views
0

我想从昨天开始使NSTextField行为像超文本一样。我几乎达到了我的目标,但我仍然有一个奇怪的错误。 我将NSTextField重写为覆盖mouseEntered:和mouseExited :.在这些方法中,我将NSTextField中的文本加下划线,并将NSCursor更改为pointingHandCursor。NSTextField光标仅在第二个鼠标上更改进入

奇怪的是,每当光标改变似乎只能从第二个mouseEntered:工作时,下划线弹出。它不会第一次显示。

它似乎与我的子类,而不是环境相关,因为如果我将两个NSTextField放在我的视图中,它们都只在第二次将鼠标放在它上方时显示光标。

这是我在子类中使用的代码:

- (id) initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super initWithCoder:aDecoder]; 
    if (self) { 
     NSTrackingAreaOptions option = NSTrackingInVisibleRect | NSTrackingMouseEnteredAndExited | NSTrackingActiveInKeyWindow; 
     NSTrackingArea * area = [[NSTrackingArea alloc] initWithRect:self.bounds options:option owner:self userInfo:nil]; 
     [self addTrackingArea:area]; 
    } 
    return self; 
} 

- (void) mouseEntered:(NSEvent *)theEvent 
{ 
    [self addCursorRect:self.bounds cursor:[NSCursor pointingHandCursor]]; 

    if (!self.undelineText) 
    { 
     NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc]initWithString:self.stringValue]; 
     NSRange range = NSMakeRange(0, [attrString length]); 
     [attrString addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInt:NSUnderlineStyleSingle] range:range]; 
     self.undelineText = attrString; 
    } 
    [self setAttributedStringValue:self.undelineText]; 
} 

- (void) mouseExited:(NSEvent *)theEvent 
{ 
    if (!self.normalText) 
    { 
     NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc]initWithString:self.stringValue]; 
     self.normalText = attrString; 
    } 
    [self setAttributedStringValue:self.normalText]; 
} 

我希望你能帮助我。

回答

1

您是否曾尝试将NSTrackingArea代码放入awakeOnNib函数中? 所以它看起来像这样:

- (void)awakeFromNib 
{ 
    NSTrackingAreaOptions option = NSTrackingInVisibleRect | NSTrackingMouseEnteredAndExited | NSTrackingActiveInKeyWindow; 
    NSTrackingArea * area = [[NSTrackingArea alloc] initWithRect:self.bounds options:option owner:self userInfo:nil]; 
    [self addTrackingArea:area]; 
}