NSComboBox 动作选择器在 setHidden:YES 时触发

Posted

技术标签:

【中文标题】NSComboBox 动作选择器在 setHidden:YES 时触发【英文标题】:NSComboBox action selector fires when setHidden:YES 【发布时间】:2012-12-03 19:39:23 【问题描述】:

我有一个 NSComboBox。我已经设置了一个动作选择器。当盒子被隐藏时,选择器会触发,即使用户从未接触过它。是的,我需要隐藏它。

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];
   

【问题讨论】:

【参考方案1】:

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

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

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

您可能想要做的是检查组合框的值是否实际发生了变化,然后才继续隐藏组合框等。

另一种选择是使用数据绑定来观察组合框的变化。将组合框 value 绑定到控制器上的属性。然后在你的控制器中实现属性设置器。

【讨论】:

动作选择器同时应用于两个控件是不是很奇怪?有没有办法只将它应用于框的选择而不是文本字段? 如果您不想让用户输入任何内容,请改用 NSPopupButton。如果您想更好地控制用户何时键入内容或从弹出窗口中选择内容,请实现相应的 NSComboBoxDelegate 和 NSTextFieldDelegate 方法。特别是,实现comboBoxSelectionDidChange: 以跟踪对弹出选择的更改。 我期待委托方法的行为类似于设置动作选择器。【参考方案2】:

试试这个[comboBox setHidden:1];

【讨论】:

objc.h #define YES (BOOL)1

以上是关于NSComboBox 动作选择器在 setHidden:YES 时触发的主要内容,如果未能解决你的问题,请参考以下文章

NSComboBox - 陷阱返回键

NSComboBox getGet 更改值

swift之NSComboBox

与 Core Data 一起使用的 NSComboBox 的正确绑定是啥

django rest框架使用动作装饰器在url中添加查看财务报表的路径

CoreData 和 NSComboBox