我试图让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];
}
我希望你能够帮助我。
答案 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];
}