Как программно открыть список NSComboBox?
Я был вокруг этого некоторое время.. Я думал, что это должно быть легкой задачей, но это не =D
То, что я пытаюсь сделать, это отобразить список в выпадающем списке, когда пользователь щелкает по списку, но не по кнопке.
Любая идея? Заранее спасибо!
6 ответов
Этот ответ соответствует названию вопроса, но не самому вопросу. Омер хотел коснуться текстового поля и открыть всплывающее окно.
Это решение показывает всплывающее окно, когда пользователь вводит текст.
Я нашел этот ответ на 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]; }
}
}
Возвращает
true
если список NSComboBox будет расширенcomboBox.cell?.isAccessibilityExpanded() ?? false
Откройте список NSComboBox
comboBox.cell?.setAccessibilityExpanded(true)
Закройте список NSComboBox
comboBox.cell?.setAccessibilityExpanded(false)
Ссылка Ответ Джуди.
Положил
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:"))
}
}
Вы можете использовать следующую строку кода:
[(NSComboBoxCell*)self.acomboBox.cell 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
}
}
}