2011-08-29 1 views
0

Mon application contient un bouton PLAY/PAUSE qui est défini sur Basculer dans Interface Builder. Je l'utilise - comme son nom l'indique - pour lire mes assets ou pour les mettre en pause.
En outre, j'écoute la touche ESPACE pour activer la même fonctionnalité via le raccourci clavier. Par conséquent, j'utilise keyDown: de NSResponder dans mon application. Ceci est fait dans une autre sous-vue. Le bouton lui-même n'est pas visible pour le moment.
Je stocke l'état actuel de la lecture dans un singleton. Comment mettre à jour le titre/titre alternatif pour le bouton toogle en tenant compte du fait que son état aurait pu être modifié par le raccourci clavier? Puis-je utiliser des liaisons?Comment gérer un NSButton à bascule?

+1

Comment, en particulier, «écoutez-vous la touche d'espace»? –

+0

@Peter Hosey J'ai ajouté quelques infos. Merci pour l'édition de la grammaire. – JJD

+0

Où implémentez-vous 'keyDown:'? NSButton vous permet de définir un raccourci clavier directement dans Interface Builder. –

Répondre

2

J'ai réussi à implémenter la mise à jour continue du titre du bouton comme suit. J'ai ajouté une liaison programmatique pour l'état (dans l'exemple buttonTitle). Notez que le IBActiontoggleButtonTitle: ne modifie pas directement le titre du bouton! Au lieu de cela, la méthode updateButtonTitle est responsable de cette tâche. Depuis self.setButtonTitle est appelé la liaison susmentionnée est mis à jour immédiatement.
L'exemple suivant montre ce que j'ai essayé de décrire.

// 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 

Et le fichier de mise en œuvre:

// 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 

Si vous stockez votre état dans un ENUM ou entier une coutume NSValueTransformer vous aidera à traduire un état dans son bouton titre équivalent. Vous pouvez ajouter le NSValueTransformer aux options de reliure.

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