当光标在它上面时如何更改NSButton的标题

use*_*834 3 macos mouse events cocoa nsbutton

我是Cocoa Programming的初学者.NSButton当光标在按钮上时,如何更改标题?(没有点击).

Mar*_*ark 7

如果你看一下NSButton的类层次结构,你会发现它是从NSResponder派生的,NSResponder是处理鼠标事件的类.

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/nsbutton_Class/Reference/Reference.html

创建NSButton的子类并覆盖以下消息以将标题设置为您想要的内容:

- (void)mouseEntered:(NSEvent *)theEvent
- (void)mouseExited:(NSEvent *)theEvent
Run Code Online (Sandbox Code Playgroud)

将其添加到初始化程序(awakeFromNib或init消息,具体取决于您的使用情况):

[self addTrackingRect:[self bounds] owner:self userData:NULL assumeInside:YES];
Run Code Online (Sandbox Code Playgroud)

请注意,即使鼠标实际上没有进入跟踪区域,标题也会第一次显示已退出的消息.如果您想在第一次进入跟踪区域之前设置第三个标题,则可能需要向类添加一些状态.

编辑:也许这会有所帮助.

这是头文件"MyButton.h":

#import <Cocoa/Cocoa.h>

@interface MTButton : NSButton {
    NSTrackingRectTag myTrackingRectTag;
}

@end
Run Code Online (Sandbox Code Playgroud)

很标准的东西.

这是我的源文件.

#import "myButton.h"


@implementation MTButton

- (void) awakeFromNib
{
    [self setTitle:@"Initial"];
    myTrackingRectTag = [self addTrackingRect:[self bounds]
                                        owner:self
                                     userData:NULL
                                 assumeInside:YES];

}

- (void) dealloc
{
    [super dealloc];
    [self removeTrackingRect:myTrackingRectTag];
}


- (void)mouseEntered:(NSEvent *)theEvent
{   
    [super mouseEntered:theEvent];

    [self setTitle:@"Entered"];
}

- (void)mouseExited:(NSEvent *)theEvent
{
    [super mouseExited:theEvent];

    [self setTitle:@"Exited"];
}

@end
Run Code Online (Sandbox Code Playgroud)