/ / NSView, що отримує події кліків через NSTextView - какао, nsview, nstextview, подія миші

NSView отримує події за допомогою NSTextView - какао, nsview, nstextview, mouseclick-event

У мене NSTextView, який не можна редагувати,не вибір, у NSView. Мені потрібен NSView, щоб отримувати події клацання, коли натискається перегляд тексту. В основному мені потрібні події клацання, щоб діяти так, ніби перегляд тексту навіть не існує. Очевидно, я просто використовував би

textView:clickedOnCell:inRect:atIndex:

метод делегування тексту перегляду, але мені потрібно зафіксувати подію клацання, щоб виявити подвійне клацання і подібні речі.

Відповіді:

8 для відповіді № 1

У вікні, що містить перегляд тексту, перемініть в hitTest: метод повертати self. Потім події миші будуть надіслані до подання контейнера.

Застереження

Я знайшов це hitTest: буде викликано для подій відстеження клацання та миші де завгодно у вікні, навіть для подій, які, звичайно, не були б де-небудь біля подання контейнера. Якщо у вікні є інші види, hitTest: метод перетворить вигляд контейнера в чорну діру, яка змушує всі ці події тяжіти до себе, ніколи не побачивши жодних інших поглядів.

Виправлення цього полягає в тому, щоб перевірити, чи подія знаходиться у вашому погляді, перш ніж проковтнути її. Якщо це так, поверніться self; якщо це не так, поверніться nil.

Найпростіший спосіб зробити це - зателефонувати superреалізація, яка поверне погляд або будь-який підвид себе, якщо точка знаходиться в межах перегляду, а потім просто повернеться self якщо цей метод повернув не-nil. Якщо воно повернулося nil, тоді ви повернетесь nilтеж.

Менш простим, але можливо більш ефективним методом було б перетворити крапку від віконної системи координат до перегляду, потім скористайтеся NSPointInRect перевірити, чи точка знаходиться в межах перегляду "s bounds.


2 для відповіді № 2

Просто для того, щоб поставити фантастичний опис Пітера в код:

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