2015-03-18 2 views
0

J'ai une application OS X avec deux cases à cocher (NSButton). Si le premier (principal) n'est pas coché, il désactive et décoche le second.Puis-je obtenir une case à cocher pour modifier visuellement son état avant d'envoyer son action?

Voici le code de cette fonctionnalité,

@IBAction func peopleCheckboxAction(sender: AnyObject) { 
    if(self.peopleCheckbox.state == NSOffState){ 
     self.peopleCommentsCheckbox.enabled = false 
     self.peopleCommentsCheckbox.state = NSOffState 

    }else{ 
    self.peopleCommentsCheckbox.enabled = true} 

} 

Mais est ici la chose: que le code est exécuté avant l'état de la première case à cocher est modifiée, et créer une action en deux étapes qui se sent presque comme le premier La boîte ne répond pas, ou l'utilisateur a peut-être cliqué sur le mauvais bouton, car le second contrôle change en premier. C'est seulement un beat off, mais je voudrais le réparer.

Existe-t-il un moyen simple d'inverser la façon dont ces deux choses sont exécutées, ou de s'assurer qu'elles se produisent presque simultanément?

Répondre

0

Vous pourriez voir quel genre d'effet vous obtenez avec les fixations - ce qui signifierait la suppression complète de la méthode d'action.

Normalement, vous devez tout configurer dans Interface Builder (IB), mais la copie et le collage du code ci-dessous vous permettent de savoir rapidement si cette approche est suffisamment réactive pour vos besoins. Si c'est le cas, vous devriez probablement faire l'effort de tout configurer dans IB, vous laissant seulement avec la propriété peopleState dans le code.

#import "AppDelegate.h" 

@interface AppDelegate() 

@property (weak) IBOutlet NSButton *peopleCheckBox; 
@property (weak) IBOutlet NSButton *commentCheckBox; 

@property NSNumber *peopleState; 

@property (weak) IBOutlet NSWindow *window; 

@end 

@implementation AppDelegate 


- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 

    // Each time you click on the peopleState checkbox, 
    // the value of the property <peopleState> will change. 
    [self.peopleCheckBox bind:@"value" 
        toObject:self 
        withKeyPath:@"peopleState" 
         options:nil]; 

    // Each time the value of the property <peopleState> changes, 
    // the 'enabled' status of the commentCheckBox is updated 
    // peopleState == NSOffState -> commentCheckBox disabled. 
    [self.commentCheckBox bind:@"enabled" 
         toObject:self 
        withKeyPath:@"peopleState" 
         options:nil]; 
} 



@end 
+0

Merci, j'ai pensé que cela pourrait fonctionner, mais il y a deux problèmes ici. Premièrement, le même problème de synchronisation semble être présent. Deuxièmement, j'ai encore besoin de désactiver la case à cocher et de la désactiver. Si je me contente de lier la propriété enabled, alors elle peut être désactivée mais commentCheckboxbox.state sera toujours NSOnState. –

1

Essayez ceci: [self.peopleCheckBox sendActionOn: NSLeftMouseDownMask]; (Le comportement par défaut est l'action est envoyé à la souris.)