objective-c - NSControl 和 NSCell : Manage the cell state the right way

标签 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 处理鼠标事件有什么特别建议吗?

最佳答案

您可以执行以下操作:

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

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

然后将跟踪区域添加到 NSControl 中:

[yourNSControl addTrackingArea:trackingArea];

在你的 NSControl 子类中同时实现

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

在那里,您可以使用控件内的单元格或控件本身执行某些操作。

希望有帮助

关于objective-c - NSControl 和 NSCell : Manage the cell state the right way,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13862610/

相关文章:

objective-c - 透明 NSTableView

objective-c - 使用 Objective C 可变参数方法调用进行类 Clang 函数宏解析时出现错误?

ios - 如何从数组中获取一个特定键的所有值?

macos - 确保窗口在 OS X Cocoa 上显示在屏幕上

objective-c - 类似 iTunes 的播放列表结构的最佳实现?

swift - 如何在 Swift 中访问 NSMetadataItem 的文本内容 (kMDItemTextContent)?

cocoa - 如何跟踪 NSMatrix 单元格中的鼠标悬停?

ios - prepareforsegue 与 didselectrowatindexpath

ios - Watchkit-应用程序 : handleWatchKitExtensionRequest error