Как изменить заголовок NSButton при наведении на него курсора - PullRequest
3 голосов
/ 28 февраля 2012

Я новичок в программировании какао. Как я могу изменить заголовок NSButton, когда курсор находится на кнопке? (без нажатия).

1 Ответ

7 голосов
/ 28 февраля 2012

Если вы посмотрите на иерархию классов для NSButton, вы увидите, что она происходит от 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

Добавьте это в ваш инициализатор (ЛибоawakeFromNib или ваше сообщение инициализации, в зависимости от вашего использования):

[self addTrackingRect:[self bounds] owner:self userData:NULL assumeInside:YES];

Обратите внимание, что даже когда мышь фактически не входила в область отслеживания, в первый раз заголовок будет отображать вышедшее сообщение.Возможно, вы захотите добавить какое-то состояние в ваш класс, если вам нужен третий набор заголовков, прежде чем он войдет в область отслеживания в первый раз.

РЕДАКТИРОВАТЬ: Может быть, это поможет.

ВотЗаголовочный файл "MyButton.h":

#import <Cocoa/Cocoa.h>

@interface MTButton : NSButton {
    NSTrackingRectTag myTrackingRectTag;
}

@end

Довольно стандартный материал.

Вот мой исходный файл.

#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
...