NSButton mouseDown mouseUp在启用时表现不同

Pet*_*isu 13 macos cocoa nsview nsbutton nscontrol

如果未启用NSButton,则mouseDown:和mouseUp:按预期运行(因此,当按下鼠标时,将调用mouseDown:,当它被释放时,将调用mouseUp:)

但是,如果启用了NSButton IS,则完全不会调用mouseUp:并且在鼠标释放后调用mouseDown:

- (void)mouseDown:(NSEvent *)theEvent {
    [super mouseDown:theEvent];
}

- (void)mouseUp:(NSEvent *)theEvent {
    [super mouseUp:theEvent];
}
Run Code Online (Sandbox Code Playgroud)

为什么这种行为有所不同,我如何强制执行正确的行为(与未启用按钮时相同)

小智 15

如果有人还在寻找这个...我不知道为什么但这对我有用...

- (void)mouseDown:(NSEvent *)theEvent {
    NSLog(@"mouse down!");
    [super mouseDown:theEvent];
    NSLog(@"mouse up!");
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您希望在释放鼠标单击时“实际运行” mouseUp功能,这是不正确的。这只是在mouseDown上调用NSLog(@“ mouse up!”)`。 (2认同)

Ken*_*ses 9

行为是正确的.您对所有鼠标事件都通过响应方法的期望是错误的.

当启用该按钮时,超类实现-mouseDown:将运行内部事件跟踪循环以跟踪鼠标移动并将按钮显示为按下,只要鼠标位于其中并在鼠标移出时将其显示为未按下.此内部事件循环是接收NSLeftMouseUp事件的内容.它永远不会发送给响应方法.

请参阅Cocoa事件处理指南:处理鼠标事件 - 处理鼠标拖动操作 - 鼠标跟踪循环方法.


All*_*ing 5

如果希望创建一个自定义按钮,如果希望创建一个自定义按钮,该按钮的操作方法可以区分按下和释放,请尝试isPressed向其添加属性,以及以下代码:

 (void)mouseDown:(NSEvent *)event
 {
    self.isPressed = true;  
    [super mouseDown:event];

    self.isPressed = false;

    [self.target performSelector:self.action withObject:self];
}
Run Code Online (Sandbox Code Playgroud)

必须将自定义按钮设置为根据以下条件发送操作:

[self.button sendActionOn: NSLeftMouseDownMask | NSLeftMouseUpMask];
Run Code Online (Sandbox Code Playgroud)

否则,直到释放按钮后才调用action方法。

在动作方法中,isPressed可以查询。例如:

int state = (int)[sender isPressed];
Run Code Online (Sandbox Code Playgroud)

这方面的一个小麻烦,但无害的“功能”是action方法被调用时两次释放按钮:从内部曾经NSButtonisPressed仍然如此。(这应该忽略。)第二次来自自定义按钮的performSelector方法,为isPressedfalse。

是否对将来的发行版有任何评论?