2011-07-06 18 views
6

Mam NSView, który obejmuje widok zawartości okna nadrzędnego. Ten widok zawiera moduł obsługi zdarzeń kliknięcia, który usuwa go z widoku treści. Wewnątrz tego widoku mam inny pogląd. Kiedy przeciągam mysz w tym wewnętrznym widoku, zdarzenia myszy są stosowane nie tylko do widoku z przodu, ale także do widoków z tyłu. Dodatkowo pojawiają się również kursory z widoków z tyłu. To jest ten sam problem występujący tutaj: NSView overlay passes mouse events to underlying subviews?, ale odpowiedź tam nie zadziała dla mojego projektu, ponieważ nie mogę otworzyć innego okna.Zdarzenia myszy krwawiące przez NSView

Dzięki.

+0

Proszę napisać kod obsługi zdarzeń dla swojego najwyższego widoku. –

Odpowiedz

12

Bez obejrzenia kodu obsługi zdarzeń trudno jest się zorientować, co się dzieje, ale podejrzewam, że można wywoływać różne metody obsługi zdarzeń w swoich implementacjach za pomocą super.

NSView jest podklasą NSResponder, więc domyślnie zdarzenia bez obsługi są przekazywane do łańcucha responderów. Podgląd widoku jest następnym obiektem w łańcuchu respondentów, więc jeśli zadzwonisz na przykład [super mouseDown:event] w implementacji ‑mouseDown:, zdarzenie zostanie przekazane do superview.

Poprawka polega na upewnieniu się, że nie wykonuje połączenia z super w programach obsługi zdarzeń.

To jest błędne:

- (void)mouseDown:(NSEvent*)anEvent 
{ 
    //do something 
    [super mouseDown:event]; 
} 

ta jest poprawna:

- (void)mouseDown:(NSEvent*)anEvent 
{ 
    //do something 
} 
+1

Oto, co było moim problemem, z tym, że musiałem wdrożyć puste metody przeciągania myszy, aktualizacji kursora i myszy, ponieważ miałem już implementację myszy w dół. Które wydarzenie obsługuje zmianę kursora? – Maz

+0

Po prostu użyj '-mouseEntered:' i '-mouseExited:' i ustaw kursor w tych metodach. –

+0

prawidłowe. Moja okładka ekranu działa teraz dobrze. –

2

odpowiedź Roba i maz za komentarz na tej odpowiedzi rozwiązać ten problem, ale wystarczy, aby całkowicie jednoznaczne. Aby uniemożliwić wykrwawienie się NSView, który jest zdarzeniem myszy dla rodzica, należy wdrożyć puste metody.

// NSResponder ========================================= 
- (void) mouseDown:(NSEvent*)event {} 
- (void) mouseDragged:(NSEvent*)event {} 
- (void) mouseUp:(NSEvent*)event {} 
Powiązane problemy