Как перевести NSButton в нажатое состояние

Нужно использовать метод setHighlighted:, но не напрямую, а сразу после того как NSButton закончит выполнение собственного обработчика события нажатия на кнопку.

- (IBAction)buttonClick:(id)sender
{
    [self performSelector:@selector(highlight:) withObject:(NSButton *)sender
               afterDelay:0.01];
}

- (void)highlight:(NSButton *)aButton
{
    [aButton.cell setHighlighted:YES];
}

Демонстрация:

Но тут может быть такой эффект, что если нажать на кнопку и не отпуская левую клавишу мыши отвести курсор мыши в сторону, то подсветка с кнопки снимается и она принимает обычный вид. Частично это можно исправить, если перекрыть метод mouseDown: в подклассе NSButton:

- (void)mouseDown:(NSEvent *)anEvent
{
    //    NSLog(@"mouse down!");
    
    [super mouseDown:anEvent];
    
    //    NSLog(@"mouse up!");
    
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.01 * NSEC_PER_SEC)
        , dispatch_get_main_queue(), ^{
            [self.cell setHighlighted:YES];
        });
}

См. также: