NSSegmentedControl программно выделяет сегмент

У меня есть NSSegmentedControl, в котором при щелчке пользователя должны быть выполнены некоторые условия, прежде чем действие будет отправлено его цели.

До сих пор мне удавалось это делать, переопределяя обработчик событий -mouseDown и вызывая обработчик [super mouseDown] segmentedControl только после успешной проверки моих условий. Только одна проблема. Пользователь не имеет никакого визуального представления о том, что сегмент был нажат, пока не будет вызван [super mouseDown].

Итак, вопрос: есть ли способ программно установить «выделенное» состояние (более или менее похожее на «setHighlighted» для NSButtons)?


person Community    schedule 05.11.2014    source источник


Ответы (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];
}
person Pierre Bernard    schedule 05.11.2014
comment
Спасибо, Пьер. Ваше решение лучше, чем ничего, но смысл все же есть. Например, во время теста сегмент будет отображаться как выбранный, что означает, что выбор был принят. Я искал способ только выделить сегмент, а не выбирать его. - person ; 05.11.2014

Вместо того, чтобы не вызывать -[NSSegmentedControl mouseDown], когда условия не выполняются, вам нужно не вызывать -[NSSegmentedCell stopTracking:at:inView:mouseIsUp:].

Вот написанный мной подкласс NSSegmentedControl, который использует делегат для условного включения выбора сегмента: .com/michal-tomlein/39171668c580ac0d497d

Вы увидите, что сегмент подсвечивается, пока вы удерживаете нажатой кнопку мыши, но затем не выделяется, и выбор остается неизменным, если вы возвращаете NO из метода делегата.

Если вы используете его из Interface Builder, не забудьте установить как класс представления (MTSegmentedControl), так и класс ячейки (MTSegmentedCell).

person Michal Tomlein    schedule 14.08.2015
comment
Спасибо Михал. Я попробую ваш код и сообщу, решит ли он мою проблему. - person ; 16.08.2015