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

Objective c NSControl和NSCell:以正确的方式管理单元状态,objective-c,cocoa,nscell,nscontrol,Objective C,Cocoa,Nscell,Nscontrol,我有一个完全定制的NSControl及其完全定制的NSCell。 现在我想实现一些鼠标交互。例如,当用户单击控件时 我想将控件状态更改为突出显示,因此问题如下: 1) 我必须在哪里处理鼠标事件?在NSControl中,还是直接在NSCell中 目前,我正在NSCell子类中使用以下代码: -(BOOL)startTrackingAt:(NSPoint)startPoint inView:(NSView *)controlView{ [self setHighlighted:YES];

我有一个完全定制的
NSControl
及其完全定制的
NSCell
。 现在我想实现一些鼠标交互。例如,当用户单击控件时 我想将控件状态更改为突出显示,因此问题如下:

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处理鼠标事件

您可以执行以下操作:

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

NSTrackingArea* trackingArea = [[[NSTrackingArea alloc] initWithRect:yourNSControlBoundsRect options:NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways owner:yourNSControl userInfo:nil];
[yourNSControl addTrackingArea:trackingArea];
然后将跟踪区域添加到NSControl:

NSTrackingArea* trackingArea = [[[NSTrackingArea alloc] initWithRect:yourNSControlBoundsRect options:NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways owner:yourNSControl userInfo:nil];
[yourNSControl addTrackingArea:trackingArea];
在NSControl子类中,实现这两个

 - (void)mouseEntered:(NSEvent *)theEvent
 - (void)mouseExited:(NSEvent *)theEvent
在那里,你可以在你的控制范围内用你的细胞做一些事情,或者用你的控制本身做一些事情


希望这有帮助

为什么我要修改跟踪区域?您根本不需要修改它。这只是一种干净的方法,因为您的NSControl子类会自动检测鼠标何时进入/退出,因此它可以对其进行操作。我需要模拟NSButton行为,这样我就不需要知道鼠标何时进入/退出我的控件。我只需要知道在自定义控件上管理鼠标事件的正确方法。目前,我正试图在NSCell级别管理它。你认为这不是一个好主意吗?你所说的“鼠标事件”是什么意思?。如果只是在内部单击,则可能需要覆盖-(void)mouseDown:(NSEvent*)事件或-(void)mouseUp:(NSEvent*)事件。我会在“控制”级别上这样做,因为如果以后添加更多子视图,则无需更改任何代码。感谢您抽出时间,Boris,在创建此问题之前,我使用的正是您在之前的评论中所说的内容。但是MouseUp并没有像预期的那样工作,通过阅读其他一些不完整的答案,我发现正确的方法是在NSCell中使用跟踪方法。但是这是我第一次使用自定义控件,所以我想确保我的选择是正确的。你告诉我用一种我已经尝试过的方式工作,但是没有用。