NSTextField光标仅在第二个mouseEntered上更改

时间:2014-07-06 00:33:50

标签: objective-c cocoa nstextfield

我试图让NSTextField从昨天开始就像超文本一样。我几乎达到了目标,但我还有一个奇怪的错误。 我将NSTextField子类化为覆盖mouseEntered:和mouseExited:。在这些方法中,我在NSTextField中为文本加下划线,并将NSCursor更改为pointingHandCursor。

奇怪的是,每次光标变化时都会弹出下划线似乎只能从第二个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 个答案:

答案 0 :(得分: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];
}