如何以编程方式打开NSComboBox的列表?

时间:2010-12-21 12:32:03

标签: objective-c cocoa nscombobox

我已经有一段时间了。我认为这应该是一件容易的事,但不是= D

我想要做的是,当用户点击组合框时显示组合框的列表,但不是在按钮中特别显示。

任何想法? 提前谢谢!

7 个答案:

答案 0 :(得分:8)

这个答案符合问题的标题,但不是问题本身。 Omer想要触摸文本字段并弹出框。

此解决方案显示用户输入文本时的弹出窗口。

我在Jens Alfke的cocoabuilder上找到了这个答案。我在这里重新发布了他的代码。谢谢Jens。

original cocoabuilder post: (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]; }
  }
}

答案 1 :(得分:3)

您可以使用以下代码行:

 [(NSComboBoxCell*)self.acomboBox.cell performSelector:@selector(popUp:)];

答案 2 :(得分:2)

感谢上面提到的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)
    }

 }



}

答案 3 :(得分:2)

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:"))
        }
}

答案 4 :(得分:1)

  1. 如果扩展了NSComboBox的列表,则返回true

    comboBox.cell?.isAccessibilityExpanded() ?? false
    
  2. 打开NSComboBox的列表

    comboBox.cell?.setAccessibilityExpanded(true)
    
  3. 关闭NSComboBox的列表

    comboBox.cell?.setAccessibilityExpanded(false)
    
  4. 参考。 jmoody’s answer

答案 5 :(得分:0)

NSComboBox不是以这种方式工作的。因为用户可能想要编辑控件中的文本,所以他们需要能够单击它而不会意外地弹出选项。

您需要继承NSComboBoxCell并更改此行为......但是您将拥有一个标准外观的控件,它不会以标准方式运行。如果您决定这样做,请查看NSComboBoxCell的开源版本。有趣的方法似乎是-popUpForComboBoxCell:和朋友。

答案 6 :(得分:0)

基于其他答案,我编写了此解决方案(在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
        }
    }
}