Как бороться с Toggle NSButton? - PullRequest
       11

Как бороться с Toggle NSButton?

0 голосов
/ 29 августа 2011

Мое приложение содержит кнопку PLAY / PAUSE, для которой установлен тип Переключить в Интерфейсном Разработчике.Я использую его - как видно из названия - чтобы воспроизвести мои активы или приостановить их.
Кроме того, я слушаю клавишу ПРОБЕЛ, чтобы включить ту же функцию с помощью сочетания клавиш.Поэтому я использую keyDown: из NSResponder в своем приложении.Это сделано в другом подпредставлении.Сама кнопка в настоящее время не видна.
Я сохраняю текущее состояние воспроизведения в синглтоне.

Как бы вы обновили заголовок / альтернативный заголовок кнопки переключателя, учитывая, что ее состояниемогли быть изменены с помощью сочетания клавиш?Могу ли я использовать привязки?

1 Ответ

2 голосов
/ 01 сентября 2011

Мне удалось реализовать непрерывное обновление заголовка кнопки следующим образом.Я добавил программную привязку для состояния (в примере buttonTitle).Обратите внимание, что IBAction toggleButtonTitle: напрямую не меняет заголовок кнопки!Вместо этого метод updateButtonTitle отвечает за эту задачу.Поскольку self.setButtonTitle вызывается, вышеупомянутая привязка немедленно обновляется.
Следующий пример показывает, что я пытался описать.

//  BindThisAppDelegate.h
#import <Cocoa/Cocoa.h>

@interface BindThisAppDelegate : NSObject<NSApplicationDelegate> {
    NSWindow* m_window;
    NSButton* m_button;
    NSString* m_buttonTitle;
    NSUInteger m_hitCount;
}

@property (readwrite, assign) IBOutlet NSWindow* window;
@property (readwrite, assign) IBOutlet NSButton* button;
@property (readwrite, assign) NSString* buttonTitle;

- (IBAction)toggleButtonTitle:(id)sender;

@end

И файл реализации:

//  BindThisAppDelegate.m
#import "BindThisAppDelegate.h"

@interface BindThisAppDelegate()
- (void)updateButtonTitle;
@end


@implementation BindThisAppDelegate

- (id)init {
    self = [super init];
    if (self) {
        m_hitCount = 0;
        [self updateButtonTitle];
    }
    return self;
}

@synthesize window = m_window;
@synthesize button = m_button;
@synthesize buttonTitle = m_buttonTitle;

- (void)applicationDidFinishLaunching:(NSNotification*)notification {
    [self.button bind:@"title" toObject:self withKeyPath:@"buttonTitle" options:nil];
}

- (IBAction)toggleButtonTitle:(id)sender {
    m_hitCount++;
    [self updateButtonTitle];
}

- (void)updateButtonTitle {
    self.buttonTitle = (m_hitCount % 2 == 0) ? @"Even" : @"Uneven";
}

@end

Вы сохраняете свое состояние в enum или integer, а пользовательский NSValueTransformer поможет вам перевести состояние в эквивалент его заголовка кнопки.Вы можете добавить NSValueTransformer к параметрам привязки.

NSDictionary* options = [NSDictionary dictionaryWithObject:[[CustomValueTransformer alloc] init] forKey:NSValueTransformerBindingOption];
[self.button bind:@"title" toObject:self withKeyPath:@"buttonTitle" options:options];
...