mouseDown: в пользовательском NSTextField внутри NSTableView - PullRequest
6 голосов
/ 23 марта 2012

У меня есть вид на основе NSTableView.Каждое представление в таблице имеет настраиваемое текстовое поле.

Я хотел бы запустить действие, когда пользователь нажимает на текстовое поле (метку) внутри представления таблицы (представьте себе, что гиперссылка с настраиваемым действиемкаждая ячейка таблицы).

Я создал базовый подкласс NSTextField для перехвата событий мыши.Однако они запускаются только при втором щелчке, а не при первом.

Я пытался использовать NSButton, и он сразу срабатывает.

Вот код для пользовательской метки:

@implementation HyperlinkTextField

- (void)mouseDown:(NSEvent *)theEvent {
    NSLog(@"link mouse down");
}

- (void)mouseUp:(NSEvent *)theEvent {
    NSLog(@"link mouse up");
}

- (BOOL)acceptsFirstResponder {
    return YES;
}

- (BOOL)acceptsFirstMouse:(NSEvent *)theEvent {
    return YES;
}
@end

Ответы [ 5 ]

7 голосов
/ 26 марта 2013

Была такая же проблема. Принятый ответ здесь не работает для меня. После долгих попыток, он волшебным образом сработал, когда я выбрал «None» в отличие от «Regular» по умолчанию, а другой опцией был «Source List» для опции «Highlight» представления таблицы в IB!

Редактировать: принятый ответ оказывается вводящим в заблуждение, поскольку метод должен быть перегружен для табличного представления, а не для текстового поля, как предполагает ответ. Это дается более четко в https://stackoverflow.com/a/13579469/804616, но в любом случае, если быть более конкретным, это кажется немного хакерским.

6 голосов
/ 25 марта 2012

Оказалось, что NSTableView и NSOultineView обрабатывают статус первого респондента для NSTextField экземпляров иначе, чем для NSButton.

Ключ, чтобы метка реагировала на первый щелчоккак кнопка перезаписать [NSResponder validateProposedFirstResponder:forEvent:], чтобы вернуть YES в случае моего пользовательского текстового поля класса.

Документация:

http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSResponder_Class/Reference/Reference.html#//apple_ref/occ/instm/NSResponder/validateProposedFirstResponder:forEvent:

1 голос
/ 28 октября 2015

В точно такой же ситуации у меня работает NSButton с transparent, установленным на true/YES.

1 голос
/ 24 марта 2012

Поведение, которое вы видите, заключается в том, что табличное представление является первым респондентом, каким оно должно быть, иначе строка не изменится, когда вы нажмете на метку - это поведение, которое ожидает пользователь при нажатии строка таблицы. Вместо подкласса метки, я думаю, было бы лучше создать подкласс таблицы и переопределить mouseDown: там. После вызова реализации mouseDown: супер-теста вы можете выполнить тест на попадание, чтобы убедиться, что пользователь щелкнул ярлык.

@implementation CustomTable

- (void)mouseDown:(NSEvent *)theEvent
{
    [super mouseDown:theEvent];
    NSPoint point = [self convertPoint:theEvent.locationInWindow fromView:nil];
    NSView *theView = [self hitTest:point];
    if ([theView isKindOfClass:[NSTextField class]])
    {
         NSLog(@"%@",[(NSTextField *)theView stringValue]);
    }
}

@end
0 голосов
/ 16 сентября 2016

Вы используете window.makeFirstResponser (myTextfield), чтобы начать редактирование текстового поля.Вы отправляете это сообщение из метода переопределения mouseDown (withEvent TheEvent: NSEvent)

...