NSSegmentedControl программно выделяет сегмент
У меня есть NSSegmentedControl
в котором по щелчку пользователя должны быть выполнены некоторые условия, прежде чем действие будет отправлено его цели.
До сих пор мне удалось сделать это, переопределив -mouseDown
обработчик событий и вызов сегментированного [super mouseDown]
Обработчик только после успешной проверки моих условий. Только одна проблема. У пользователя нет визуальной подсказки о том, что сегмент был нажат до [super mouseDown]
вызывается.
Поэтому возникает вопрос: есть ли способ установить "выделенное" состояние программно (более или менее как "setHighlighted
" за NSButtons
)?
2 ответа
Вы можете отменить выбор выбранного сегмента в методе действия. Вы можете объездить через дополнительный метод действия
- (IBAction)toggleSegments:(id)sender
{
NSSegmentedControl *segmentedControl = sender;
NSInteger selectedSegment = segmentedControl.selectedSegment;
if (! conditionsAreMet) {
[segmentedControl setSelected:NO forSegment:selectedSegment];
return;
}
[NSApp sendAction:@selector(reallyToggleSegments:) to:nil from:sender];
}
Вместо того, чтобы не вызывать -[NSSegmentedControl mouseDown]
когда условия не выполнены, вам не нужно вызывать -[NSSegmentedCell stopTracking:at:inView:mouseIsUp:]
,
Вот подкласс NSSegmentedControl, который я написал и который использует делегата для условного включения выбора сегмента: https://gist.github.com/michal-tomlein/39171668c580ac0d497d
Вы увидите, что сегмент подсвечивается, пока вы удерживаете кнопку мыши, но затем он не выделяется, и выбор остается неизменным, если вы вернетесь NO
из метода делегата.
Если вы используете его из Interface Builder, не забудьте установить оба класса представления (MTSegmentedControl
) и класс ячейки (MTSegmentedCell
).