8

我已经有一段时间了..我认为这应该是一件容易的事,但事实并非如此 =D

我想要做的是在用户单击组合框时显示组合框的列表,但不是专门在按钮中。

任何想法?提前致谢!

4

7 回答 7

9

这个答案符合问题的标题,但不符合问题本身。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]; }
  }
}
于 2013-06-27T15:09:08.040 回答
4
  1. 返回trueNSComboBox 的列表是否展开

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

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

    comboBox.cell?.setAccessibilityExpanded(false)
    

参考。jmoody的回答

于 2016-09-02T01:09:48.747 回答
3

您可以使用以下代码行:

 [(NSComboBoxCell*)self.acomboBox.cell performSelector:@selector(popUp:)];
于 2014-11-25T11:04:40.327 回答
3

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:"))
        }
}
于 2015-10-04T22:12:40.187 回答
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)
    }

 }



}
于 2015-01-07T21:44:29.300 回答
0

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

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

于 2010-12-22T15:51:08.153 回答
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
        }
    }
}
于 2019-07-05T15:11:39.433 回答