2011-07-06 37 views
6

Tôi có một NSView bao gồm chế độ xem nội dung của cửa sổ mẹ. Chế độ xem này có trình xử lý sự kiện nhấp để xóa nó khỏi chế độ xem nội dung. Bên trong quan điểm này, tôi có một cái nhìn khác. Khi tôi kéo chuột trong chế độ xem bên trong này, các sự kiện chuột được áp dụng không chỉ cho chế độ xem ở mặt trước mà còn cho các chế độ xem phía sau. Ngoài ra, các con trỏ từ các khung nhìn phía sau cũng xuất hiện. Đây là vấn đề tương tự xảy ra ở đây: NSView overlay passes mouse events to underlying subviews? nhưng câu trả lời sẽ không hoạt động cho dự án của tôi vì tôi không thể mở một cửa sổ khác.Sự kiện chuột Chảy máu qua NSView

Cảm ơn.

+0

Vui lòng đăng mã xử lý sự kiện cho chế độ xem cao nhất của bạn. –

Trả lời

12

Nếu không nhìn thấy mã xử lý sự kiện của bạn thì thật khó để biết điều gì đang xảy ra, nhưng tôi nghi ngờ bạn có thể đang thực hiện các phương thức xử lý sự kiện khác nhau trong triển khai của bạn.

NSView là lớp con của NSResponder, vì vậy theo mặc định, các sự kiện chưa xử lý được chuyển qua chuỗi phản hồi. Giám sát của chế độ xem là đối tượng tiếp theo trong chuỗi phản hồi, vì vậy nếu bạn gọi, ví dụ: [super mouseDown:event] khi bạn triển khai ‑mouseDown:, sự kiện sẽ được chuyển tới superview.

Khắc phục là đảm bảo bạn không gọi triển khai super trong trình xử lý sự kiện của bạn.

này là không chính xác:

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

này là đúng:

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

Đây là vấn đề của tôi ngoại trừ việc tôi cần phải triển khai các phương thức trống để kéo chuột, cập nhật con trỏ và di chuột lên, vì tôi đã thực hiện thao tác thả chuột. Sự kiện nào, mặc dù, xử lý việc thay đổi con trỏ? – Maz

+0

Chỉ cần sử dụng '-mouseEntered:' và '-mouseExited:' và đặt con trỏ trong các phương thức đó. –

+0

chính xác. Chế độ xem của tôi hiện đang hoạt động tốt. –

2

câu trả lời của Rob và bình luận Maz về câu trả lời mà giải quyết vấn đề này, nhưng chỉ để làm cho nó hoàn toàn rõ ràng. Để ngăn chặn một NSView từ chảy máu đó là sự kiện chuột để cha mẹ, người ta phải thực hiện các phương pháp trống.

// NSResponder ========================================= 
- (void) mouseDown:(NSEvent*)event {} 
- (void) mouseDragged:(NSEvent*)event {} 
- (void) mouseUp:(NSEvent*)event {} 
Các vấn đề liên quan