Селектор действий 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
в собственность на вашем контроллере. Затем реализуйте установщик свойств в вашем контроллере.