NSView получает события щелчка через NSTextView - PullRequest
7 голосов
/ 20 августа 2011

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

textView:clickedOnCell:inRect:atIndex:

, но мне нужно захватить событие click, чтобы обнаружить двойной щелчок и тому подобное.

Ответы [ 2 ]

8 голосов
/ 20 августа 2011

В представлении, содержащем текстовое представление, переопределите метод hitTest: для возврата self. События мыши будут отправлены в представление контейнера.

Протест

С тех пор я обнаружил, что hitTest: будет вызываться для событий щелчка и отслеживания мыши в любом месте в окне, даже для событий, которые, естественно, не будут находиться рядом с представлением контейнера. Если в окне есть другие виды, ваш метод hitTest: превратит вид контейнера в черную дыру, которая заставляет все эти события притягиваться к себе, никогда не видя другие виды.

Исправление для этого заключается в проверке того, находится ли событие в вашем поле зрения, прежде чем его проглотить. Если это так, верните self; если это не так, верните nil.

Самый простой способ сделать это - вызвать реализацию super, которая вернет представление или любое подпредставление самого себя, если точка находится в представлении, а затем просто вернет self, если этот метод возвратил не- nil. Если он вернул nil, то вы также вернете nil.

Менее простой, но, возможно, более эффективный метод: преобразовать точку из системы координат окна в вид, а затем используйте NSPointInRect, чтобы проверить, находится ли точка в пределах bounds вида. .

2 голосов
/ 20 июня 2014

Просто, чтобы поместить фантастическое описание Питера в код:

- (NSView *)hitTest:(NSPoint)aPoint
{
    NSView *result = [super hitTest:aPoint];
    if (result)
    {
        result = self;
    }
    return result;
}
...