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 绘图例程

OS X 10.10中的自定义NSControl类

NSControl对象中的日语字体呈现不正确

核心数据、NSTableColumn 绑定和自定义 NSCell

NSControl 对象内的日文字体渲染不正确

当堆栈视图调整大小时,如何让 NSButton 与 NSStackView 分离?