/ / NSView получаване на събития чрез кликване чрез NSTextView - какао, nsview, nstextview, mouseclick-събитие

NSView получава събития чрез кликване чрез NSTextView - какао, nsview, nstextview, mouseclick-събитие

Имам NSTextView, не редактирам,невъзможно, в NSView. Имам нужда от NSView, за да получавам кликващи събития, когато се кликне върху текстовия изглед - основно имам нужда от събитията с щракване, за да се държа така, сякаш текстовият изглед дори не съществува. Очевидно бих използвал

textView:clickedOnCell:inRect:atIndex:

текстов метод за делегат, но трябва да заснемам събитието за кликване, да откривам двойни кликвания и такива неща.

Отговори:

8 за отговор № 1

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

Протест

Оттогава съм намерила това hitTest: ще бъдат извикани за събития за проследяване на кликвания и мишки навсякъде в прозореца дори при събития, които естествено не биха се намирали близо до изгледа на контейнера. Ако има други изгледи в прозореца, вашият hitTest: методът ще превърне изгледа на контейнера в черна дупка, която кара всички тези събития да се привличат в себе си, никога да не се виждат от други гледни точки.

Решението за това е да проверите дали събитието е в рамките на вашето мнение, преди да го погълнете. Ако е така, върнете се self; ако не е, върнете се nil.

Най-лесният начин да направите това е да се обадите super", което ще върне изгледа или самото понятие, ако точката е в рамките на гледната точка, а след това просто се върнете self ако този метод върне не-nil, Ако се върне nil, тогава се върнете nil, също.

По-малко прост, но по-ефикасен метод би бил преобразувайте точката от координатната система на прозореца до изгледа, след това използвайте NSPointInRect за да проверите дали точката е в рамките на изгледа bounds.


2 за отговор № 2

Само да поставим фантастичното описание на Питър в код:

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