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).

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