NSControl和NSCell:以正确的方式管理单元状态

时间:2012-12-13 15:03:10

标签: objective-c cocoa nscell nscontrol

我有一个完全自定义NSControl,完全自定义NSCell。 现在我想实现一些鼠标交互。例如,当用户点击控件时 我想将控件状态更改为highlight,所以问题是:

1)我必须处理鼠标事件?在NSControl或直接在NSCell

目前我在NSCell子类中使用此代码:

-(BOOL)startTrackingAt:(NSPoint)startPoint inView:(NSView *)controlView{
    [self setHighlighted:YES];

    return YES;
}

-(void)stopTracking:(NSPoint)lastPoint at:(NSPoint)stopPoint inView:(NSView *)controlView mouseIsUp:(BOOL)flag{
    [self setHighlighted:NO];
}

2)NSCell是否自动管理NSControl状态?如果我将NSControl stete设置为highlight,它将被镜像到NSCell

3)启用属性怎么样? 目前我在NSControl中编写了这段代码: 而这个代码在NSControl中

-(void)setEnabled:(BOOL)flag{
    [super setEnabled:flag];
    [[self cell]setEnabled:flag];
    [self updateCell:[self cell]];
}

您是否特别建议使用自定义NSControl + NSCell的鼠标事件?

1 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

创建一个NSTrackingArea,它将检测鼠标是否进入你的NSControl:

NSTrackingArea* trackingArea = [[[NSTrackingArea alloc] initWithRect:yourNSControlBoundsRect options:NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways owner:yourNSControl userInfo:nil];

然后将trackingArea添加到NSControl:

[yourNSControl addTrackingArea:trackingArea];

在NSControl子类中实现两者

 - (void)mouseEntered:(NSEvent *)theEvent
 - (void)mouseExited:(NSEvent *)theEvent

在那里,你可以在你的控制范围内或你的控制本身对你的细胞做些什么。

希望有所帮助