在发送动作之前,我可以让Checkbox在视觉上改变其状态吗?

时间:2015-03-18 21:28:59

标签: macos cocoa nsbutton

我有一个带有两个复选框的OS X应用程序(NSButton)。如果未选中第一个(主要),则禁用并取消选中第二个(主要)。

以下是该功能的代码,

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

    }else{
    self.peopleCommentsCheckbox.enabled = true}

}

但事情就是这样:代码在第一个复选框的状态发生变化之前执行,并创建一个两步操作,感觉几乎就像第一个框没有响应,或者可能是用户单击了错误的按钮,因为第二个控件首先更改。它只是一个节拍,但我想解决它。

有没有一种简单的方法来扭转执行这两件事的方式,或确保他们几乎同时发生?

2 个答案:

答案 0 :(得分:1)

试试这个:     [self.peopleCheckBox sendActionOn:NSLeftMouseDownMask]; (默认行为是鼠标向上发送操作。)

答案 1 :(得分:0)

你可以看到绑定带来了什么样的效果 - 这意味着完全取消了动作方法。

您通常会在Interface Builder(IB)中进行设置,但复制和粘贴下面的代码会让您快速了解此方法是否足以满足您的需求。如果是,你应该努力在IB中设置它,只留下代码中的peopleState属性。

#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