objective-c - setHidden :YES 时 NSComboBox Action 选择器触发

标签 objective-c macos cocoa nscombobox nscontrol

我有一个 NSComboBox。我设置了一个 Action 选择器。当该框被隐藏时,即使用户从未触摸过它,选择器也会触发。是的,我需要隐藏它。

IBOutlet NSComboBox *comboBox;

[comboBox setAction:@selector(onComboBoxSelection:)];

- (void)onComboBoxSelection:(id)sender
{
   NSLog(@"Why does this fire twice");
   //My code doesn't actually set hidden here, it's just for proof while debugging the issue.
   [comboBox setHidden:YES];
}

为什么隐藏 NSControl 会触发它的选择器?解决这个问题的最佳方法是什么?

更新: 我已经通过包装方法修复了它。但我仍然想了解原因,或其他解决方法。

- (void)onComboBoxSelection:(id)sender
{
   if(![sender isHidden]{
     NSLog(@"Now only fires once");
     //My code doesn't actually set hidden here, it's just for proof while debugging the issue.
     [comboBox setHidden:YES];
   }
}

最佳答案

onComboBoxSelection: 中设置断点,并在第二次调用时查看回溯(在调试器中键入 bt 以查看回溯)。这将解释发生了什么。

组合框既是文本字段又是弹出窗口,它将触发两者的操作。当编辑结束时,通过按 Return 键或当它放弃第一响应者(例如,跳出到另一个字段)时,会触发文本字段操作。

当您隐藏组合框时,文本字段将放弃第一响应者并触发其操作。

您可能想要做的是检查组合框值是否实际上已更改,然后才继续隐藏组合框等。

另一个选项是使用数据绑定(bind)来观察组合框的更改。将组合框value 绑定(bind)到 Controller 上的属性。然后在 Controller 中实现属性 setter 。

关于objective-c - setHidden :YES 时 NSComboBox Action 选择器触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13690418/

相关文章:

cocoa - SQLite 核心数据存储保存在 Lion 中的哪里?

objective-c - 将函数移动到单独的类

ios - UITableView 单元格被发送 setSelected :NO during layoutView

c++ - 快速获取生命支持

macos - 从终端在 MAC OS 上安装 dmg 包

xcode - 无法在 OSX 10.8 以下设置部署目标(错误 : dyld: Library not loaded -- Reason: Incompatible library version)

iphone - 将 View 缩小到左上角的动画

iOS pdf 加密 256 位 AES

iOS7 和 iOS 8 位置服务

java - 为什么尝试使用此可传输的数据风格时在 OSX 上没有出现协议(protocol)错误?