在可可窗口控制器中获取鼠标事件

时间:2013-09-10 09:17:09

标签: objective-c macos cocoa

我应该如何在Cocoa窗口控制器中获取鼠标事件,或者我应该尝试另一种方式?

我正在设计一个功能,当鼠标悬停在其区域上时,文本字段会转换为一个大的加号。

1 个答案:

答案 0 :(得分:1)

我建议继承NSTextField并在那里处理事件。正如trojanfoe所说,它内置了鼠标处理功能。此外,您所描述的功能听起来像是您可能会在同一个应用程序或其他应用程序中再次使用的功能。只需将类设置为自定义NSTextField即可节省时间。

看起来像这样:

<强> DCOHoverTextField.h

#import <Cocoa/Cocoa.h>

/** An `NSTextField` subclass that supports mouse entered/exited events.
 */
@interface DCOHoverTextField : NSTextField

@end

<强> DCOHoverTextField.m

#import "DCOHoverTextField.h"

@interface DCOHoverTextField()

/* Holds the tracking area for the `NSTextField`. */
@property (strong) NSTrackingArea *trackingArea;

@end

@implementation DCOHoverTextField

- (void)updateTrackingAreas {
    // Remove tracking area if we have one
    if(self.trackingArea) {
        [self removeTrackingArea:self.trackingArea];
    }

    // Call super
    [super updateTrackingAreas];

    // Create a new tracking area
    self.trackingArea = [[NSTrackingArea alloc] initWithRect:self.bounds
                                                     options: NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways
                                                       owner:self
                                                    userInfo:nil];

    // Add it
    [self addTrackingArea:self.trackingArea];
}

- (void)mouseEntered:(NSEvent *)theEvent {
    // TODO: Change text field into a plus sign.
}

- (void)mouseExited:(NSEvent *)theEvent {
    // TODO: Change text field back into a regular text field.
}

@end

创建子类后,进入Interface Builder,选择NSTextField并将类更改为您创建的子类。