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中使用跟踪方法。但是这是我第一次使用自定义控件,所以我想确保我的选择是正确的。你告诉我用一种我已经尝试过的方式工作,但是没有用。