Селектор действий NSComboBox срабатывает, когда setHidden:YES

У меня есть NSComboBox. Я установил селектор действий. Когда коробка скрыта, селектор срабатывает, даже если пользователь никогда не трогал его. Да, мне нужно это скрыть.

IBOutlet NSComboBox *comboBox;

[comboBox setAction:@selector(onComboBoxSelection:)];

- (void)onComboBoxSelection:(id)sender
{
   NSLog(@"Why does this fire twice");
   //My code doesn't actually set hidden here, it's just for proof while debugging the issue.
   [comboBox setHidden:YES];
}

Зачем скрывать NSControl огонь это селектор? Какой лучший способ это исправить?

Обновление: я исправил это, обернув метод. Но я все еще хотел бы понять, почему или другие способы исправить это.

- (void)onComboBoxSelection:(id)sender
{
   if(![sender isHidden]{
     NSLog(@"Now only fires once");
     //My code doesn't actually set hidden here, it's just for proof while debugging the issue.
     [comboBox setHidden:YES];
   }
}

2 ответа

Решение

Установить точку останова в onComboBoxSelection: и посмотрите на обратную трассировку, когда она вызывается во второй раз (введите bt в отладчике, чтобы увидеть след). Это объяснит, что происходит.

Поле со списком - это и текстовое поле, и всплывающее окно, и оно будет запускать действия для обоих. Действие текстового поля запускается, когда редактирование заканчивается, либо нажатием клавиши Return, либо при отставке первого респондента (например, переход в другое поле).

Когда вы скрываете поле со списком, текстовое поле подает в отставку первый респондент и запускает его действие.

Что вы, вероятно, хотите сделать, это проверить, действительно ли изменилось значение поля со списком, и только затем продолжить скрывать поле со списком и т. Д.

Другой вариант - использовать привязки данных, чтобы наблюдать изменения в поле со списком. Привязать поле со списком value в собственность на вашем контроллере. Затем реализуйте установщик свойств в вашем контроллере.

Попробуй это [comboBox setHidden:1];

Другие вопросы по тегам