NSControl 和 NSCell:以正确的方式管理单元状态
Posted
技术标签:
【中文标题】NSControl 和 NSCell:以正确的方式管理单元状态【英文标题】:NSControl and NSCell: Manage the cell state the right way 【发布时间】:2012-12-13 15:03:10 【问题描述】:我有一个完全自定义的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】:您可以执行以下操作:
创建一个 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
在那里,您可以对控件中的单元格或控件本身执行某些操作。
希望有帮助
【讨论】:
为什么要修改追踪区域? 你根本不需要修改它。它只是一种干净的方法,因为您的 NSControl 子类会自行检测鼠标何时进入/退出,因此它可以对其进行操作。 我需要模拟一个 NSButton 行为,所以我不需要知道鼠标何时进入/退出我的控件。我只需要知道哪种方法是在自定义控件上管理鼠标事件的正确方法。目前我正在尝试在 NSCell 级别进行管理。你觉得这不是个好主意吗? “鼠标事件”是什么意思?如果它只是在里面单击,您可能需要覆盖 -(void)mouseDown:(NSEvent*)theEvent 或 -(void)mouseUp:(NSEvent*)theEvent。我会在“控制”级别执行此操作,因为如果您稍后添加更多子视图,则无需更改任何代码。 感谢您抽出时间鲍里斯,在创建这个问题之前,我完全按照您在之前的评论中所说的话。但是 MouseUp 没有按预期工作,阅读了其他一些不完整的答案,我知道正确的方法是使用 NSCell 中的跟踪方法。但这是我第一次使用自定义控件,所以我想确保我的选择是正确的。你告诉我以我已经尝试过但没有奏效的方式工作。以上是关于NSControl 和 NSCell:以正确的方式管理单元状态的主要内容,如果未能解决你的问题,请参考以下文章
Layer-Backed NSControl 仍然调用 NSCell 绘图例程