我已经有一段时间了..我认为这应该是一件容易的事,但事实并非如此 =D
我想要做的是在用户单击组合框时显示组合框的列表,但不是专门在按钮中。
任何想法?提前致谢!
我已经有一段时间了..我认为这应该是一件容易的事,但事实并非如此 =D
我想要做的是在用户单击组合框时显示组合框的列表,但不是专门在按钮中。
任何想法?提前致谢!
这个答案符合问题的标题,但不符合问题本身。Omer 想要触摸一个文本字段并弹出该框。
此解决方案在用户输入文本时显示弹出窗口。
我在Jens Alfke 的 cocoabuilder 上找到了这个答案。我在这里转发了他的代码。谢谢詹斯。
原 cocoabuilder 帖子:(http://www.cocoabuilder.com/archive/cocoa)
@interface NSComboBox (MYExpansionAPI)
@property (getter=isExpanded) BOOL expanded;
@end
@implementation NSComboBox (MYExpansionAPI)
- (BOOL) isExpanded
{
id ax = NSAccessibilityUnignoredDescendant(self);
return [[ax accessibilityAttributeValue:
NSAccessibilityExpandedAttribute] boolValue];
}
- (void) setExpanded: (BOOL)expanded
{
id ax = NSAccessibilityUnignoredDescendant(self);
[ax accessibilitySetValue: [NSNumber numberWithBool: expanded]
forAttribute: NSAccessibilityExpandedAttribute];
}
我在我的controlTextDidChange:
方法中使用了这段代码。
- (void) controlTextDidChange:(NSNotification *) aNotification {
NSTextField *textField = [aNotification object];
NSString *value = [textField stringValue];
NSComboBox *box = [self comboBox];
if (value == nil || [value length] == 0) {
if ([box isExpanded]) { [box setExpanded:NO]; }
} else {
if (![box isExpanded]) { [box setExpanded:YES]; }
}
}
返回true
NSComboBox 的列表是否展开
comboBox.cell?.isAccessibilityExpanded() ?? false
打开 NSComboBox 的列表
comboBox.cell?.setAccessibilityExpanded(true)
关闭 NSComboBox 的列表
comboBox.cell?.setAccessibilityExpanded(false)
参考。jmoody的回答。
您可以使用以下代码行:
[(NSComboBoxCell*)self.acomboBox.cell performSelector:@selector(popUp:)];
放
comboBoxCell.performSelector(Selector("popUp:"))
进入
override func controlTextDidChange(obj: NSNotification) {}
是我最终的结果。谢谢@Ahmed Lotfy
这是完整的代码,它适用于 OSX 10.11
override func controlTextDidChange(obj: NSNotification) {
if let comboBoxCell = self.comboBox.cell as? NSComboBoxCell {
comboBoxCell.performSelector(Selector("popUp:"))
}
}
感谢上面提到的 jmoody 和 Jens Alfke。这是上述解决方案的 SWIFT 翻译。
import Cocoa
class CComboBoxEx: NSComboBox
{
override func drawRect(dirtyRect: NSRect) {
super.drawRect(dirtyRect)
// Drawing code here.
}
func isExpanded() -> Bool{
if let ax:AnyObject? = NSAccessibilityUnignoredDescendant(self) {
if ax!.accessibilityAttributeValue(NSAccessibilityExpandedAttribute) != nil {
return true
}
}
return false
}
func setExpanded (bExpanded:Bool) {
if let ax:AnyObject? = NSAccessibilityUnignoredDescendant(self) {
ax!.accessibilitySetValue(NSNumber(bool: bExpanded), forAttribute: NSAccessibilityExpandedAttribute)
}
}
}
NSComboBox 并非设计为以这种方式工作。因为用户可能想要编辑控件中的文本,所以他们需要能够单击它而不会意外弹出选项。
您需要将 NSComboBoxCell 子类化并更改此行为……但是您将拥有一个外观标准的控件,该控件不以标准方式运行。如果您决心这样做,请查看NSComboBoxCell的开源版本。有趣的方法似乎是 -popUpForComboBoxCell: 和朋友。
根据其他答案,我编写了这个解决方案(使用 Xcode 10.2.1、Swift 5 测试)。它使用相同的想法,但它更短一些。
// Put this extension for NSComboBox somewhere in your project
import Cocoa
public extension NSComboBox {
var isExpanded: Bool{
set {
cell?.setAccessibilityExpanded(newValue)
}
get {
return cell?.isAccessibilityExpanded() ?? false
}
}
}
// Set your corresponding NSViewController as NSComboBoxDelegate
// in the storyboard and add this piece of code
// to expand the combobox when the user types
class MyViewController: NSViewController, NSComboBoxDelegate {
func controlTextDidChange(_ notification: Notification) {
guard let comboBox = notification.object as? NSComboBox else { return }
if comboBox.isExpanded == false {
comboBox.isExpanded = true
}
}
}