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 时触发的主要内容,如果未能解决你的问题,请参考以下文章
与 Core Data 一起使用的 NSComboBox 的正确绑定是啥