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];
}
我希望你能帮助我。