2014-09-23 2 views
1

Есть ли способ закрыть всплывающее окно NSComboBox программно?NSComboBox close popup pogrammatically

Кажется, что ошибка с NSComboBox, когда всплывающее окно открыто, и элемент управления get удален, а затем выпущен. По какой-то причине dealloc NSComboBox не очищает всплывающее окно перед разрушением.

Редактировать: просто для пояснения - эта ошибка возникает только при вскрытии списка всплывающих окон. В противном случае управление будет выпущено правильно и чисто.

Редактировать Редактировать: Вот как воспроизвести его.

  • Создайте новое приложение для какао.
  • Отключить автоматический подсчет ссылок.
  • В @ (applicationDidFinishLaunching) создайте новый NSComboBox и сохраните его члену.
  • Добавьте поле со списком в окно содержимого окна.
  • Создайте новый пункт меню с помощью сочетания клавиш и привяжите его к селектору.
  • В селекторе элемента меню: снимите поле со списком с экрана и отпустите элемент. Не забудьте вернуть его в нуль.
  • Запуск приложения.
  • Нажмите на поле со списком, чтобы отобразить всплывающее окно.
  • Используйте ярлык, чтобы удалить поле со списком.
+0

Я хотел бы предположить, что вызов 'abortEditing' бы закрыть его. Я не уверен, что вы говорите «не очищать всплывающее окно перед разрушением». всплывающее окно является частью 'NSComboBox', поэтому, безусловно, должно быть выпущено. вы каким-то образом его сохраняете? –

+0

Да, вы правы, что элемент управления должен уничтожать всплывающее окно при его выпуске, но это не так, - я думаю, что это ошибка. Легко реплицироваться с помощью чистого проекта. – AndyTang

+0

@ (abortEditing) действительно работа! Однако он оставляет всплывающее окно висящим, поскольку оно не закрыло его, но оно больше не разбивается, поскольку оно не пытается получить доступ к тому, что уже было удалено из-за того, что @ (abortEditing) очищает некоторые вещи. – AndyTang

ответ

-2

Вы можете выполнять проверку в вашем коде или серый цвет пункты меню, используя NSComboBox методы делегата -comboBoxWillPopUp: и -comboBoxWillDismiss: для управления BOOL.

Свойство BOOL может использоваться для управления включением пункта меню.

Установите делегат в поле со списком.

Для интерфейса делегата добавить

@property BOOL itemEnabled;

и реализации добавить

- (void)comboBoxWillPopUp:(NSNotification *)notification { 
    self.itemEnabled = NO; 
} 
- (void)comboBoxWillDismiss:(NSNotification *)notification { 
    self.itemEnabled = YES; //re-enabled when dismissed 
} 

Установить начальное значение itemEnabled для YES.

В XIb связать Enabled атрибут пункта меню делегата и модели Key Path установлен в self.itemEnabled

+0

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