2011-08-20 25 views
5

Tất cả, Vì vậy, tôi có một lớp con của NSBox và có các bản xem trước trong đó như nhãn và hai imageView. Tôi đã ghi đè menuForEvent: trong đó. Tuy nhiên, khi tôi bấm vào các NSBox để chọn nó và sau đó Control + Click vào bất kỳ subviews của nó sau đó menuForEvent: không bao giờ được gọi.Điều khiển + Nhấp vào trình đơn không kích hoạtForEvent

Tôi không hiểu tại sao lại như vậy.

+0

Tôi có cùng một thứ trong một bảng ... sẽ cho bạn biết những gì tôi tìm thấy. –

Trả lời

1

Bạn cần phải thực hiện menuForEvent: trong subviews quá, và chuyển tiếp các sự kiện để (NSBox subclass) của SuperView bạn thực hiện menuForEvent:

- (NSMenu *)menuForEvent:(NSEvent *)event 
{ 
    return [[self superview] menuForEvent:event]; 
} 

Tôi cho rằng nó sẽ tự động rơi thông qua các SuperView mà không có sự cần cho subclassing subviews. Tôi thấy rằng nhấp chuột phải, nhưng vì một lý do nào đó, nhấp chuột điều khiển thì không.

+0

Điều này thực sự giải quyết vấn đề một cách dễ dàng, cảm ơn! – duncanwilcox

4

Có sự khác biệt về cách thức kiểm soát nhấp chuột và nhấp chuột phải được xử lý bởi NSView (như jfewtr đã chỉ ra). Trình đơn ngữ cảnh sẽ xuất hiện cho một số nhấp chuột phải nếu nhấp chuột nằm trong chế độ xem phụ, nhưng không xuất hiện đối với một lần kiểm soát .

Tôi đã rất ngạc nhiên bởi điều này và thực sự đã viết một bài về nó với nhiều chi tiết ở đây: NSView control-click quirks

Có một vài giải pháp tiềm năng, nhưng trọng/tùy biến toàn bộ cây subview của bạn có lẽ không phải là lựa chọn tốt nhất. Tôi đã tìm thấy việc sửa chữa tốt nhất cho điều này là để hiển thị menu ngữ cảnh của bạn một cách rõ ràng trong bạn xem top-level (NSBox lớp con của bạn) cho một nhấp nút điều khiển:

- (void)mouseDown:(NSEvent *)theEvent 
{ 
    if (theEvent.modifierFlags & NSControlKeyMask) 
    { 
     [NSMenu popUpContextMenu:[self menuForEvent:theEvent] withEvent:theEvent forView:self]; 
    } 
} 

Trong khi nó không phải là tuyệt vời để hardcode hành vi này, nó tránh thao tác hoặc di chuyển toàn bộ cây con của bạn, có thể gây ra nhiều tác dụng phụ/lỗi có vấn đề hơn.

Các vấn đề liên quan