Как программно открыть список NSComboBox? - PullRequest
6 голосов
/ 21 декабря 2010

Я был вокруг этого некоторое время .. Я думал, что это должно быть легкой задачей, но это не = D

То, что я пытаюсь сделать, это отобразить список со списком, когда пользователь щелкает по списку, но не по кнопке.

Есть идеи? Заранее спасибо!

Ответы [ 7 ]

8 голосов
/ 27 июня 2013

Этот ответ соответствует названию вопроса, но не самому вопросу.Омер хотел коснуться текстового поля и открыть всплывающее окно.

Это решение показывает всплывающее окно, когда пользователь вводит текст.

Я нашел этот ответ на cocoabuilder от Jens Alfke .Я сохранил его код здесь.Спасибо, Дженс.

оригинальный пост 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]; }
  }
}
3 голосов
/ 25 ноября 2014

Вы можете использовать следующую строку кода:

 [(NSComboBoxCell*)self.acomboBox.cell performSelector:@selector(popUp:)];
2 голосов
/ 05 октября 2015

Помещенный

comboBoxCell.performSelector(Selector("popUp:"))

В

override func controlTextDidChange(obj: NSNotification) {}

это то, что я закончил. Спасибо @ Ахмед Лотфи

Вот полный код, у меня он работает на OSX 10.11

override func controlTextDidChange(obj: NSNotification) {
        if let comboBoxCell = self.comboBox.cell as? NSComboBoxCell {
            comboBoxCell.performSelector(Selector("popUp:"))
        }
}
2 голосов
/ 08 января 2015

Благодаря вышеупомянутым 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)
    }

 }



}
1 голос
/ 02 сентября 2016
  1. Возвращает true, если список NSComboBox расширен

    comboBox.cell?.isAccessibilityExpanded() ?? false
    
  2. Открыть список NSComboBox

    comboBox.cell?.setAccessibilityExpanded(true)
    
  3. Закрыть список NSComboBox

    comboBox.cell?.setAccessibilityExpanded(false)
    

Ref. Jmoody's answer .

0 голосов
/ 05 июля 2019

Основываясь на других ответах, я написал это решение (протестировано с 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
        }
    }
}
0 голосов
/ 22 декабря 2010

NSComboBox не был разработан для такой работы.Поскольку пользователь может захотеть отредактировать текст в элементе управления, он должен иметь возможность щелкнуть по нему без неожиданного появления вариантов выбора.

Вам нужно будет создать подкласс NSComboBoxCell и изменить это поведение ... но тогда у вас будет стандартный элемент управления, который не ведет себя стандартным образом.Если вы полны решимости сделать это, взгляните на версию NSComboBoxCell с открытым исходным кодом.Интересные методы - это -popUpForComboBoxCell: и друзья.

...