2010-04-09 31 views
6

Tôi có một NSMenu có chứa NSMenuItems với chế độ xem tùy chỉnh. Tôi muốn nó để khi các nút alt được nhấn, các mục trình đơn sẽ thay đổi một phần của cái nhìn của họ (thông qua quan điểm của họ). Tôi tìm thấy setAlternative trong tài liệu NSMenuItem, tuy nhiên, trong thực tế tôi chỉ có thể làm cho nó hoạt động với NSMenuItems mà không có chế độ xem tùy chỉnh. Ngay sau khi tôi đặt chế độ xem tùy chỉnh, tất cả các mục menu sẽ được hiển thị. Ngoài ra, tôi đã thử nhận các sự kiện nhấn phím trong khi menu được mở. Do vòng lặp chạy khác, NSApplication's sendEvent: không nhận được sự kiện cho đến khi menu bị đóng. Vì vậy, tôi không thể chặn đứng sự kiện sắp tới.Các mục menu thay thế trong NSMenu

Có ai biết làm thế nào tôi có thể nhận được thông báo, cho dù thông qua ủy quyền hoặc phân lớp, khi nhấn phím alt khi mở một menu?

Trả lời

6

Bạn nên đặt đối tượng làm đại biểu của menu và sau đó triển khai phương thức ủy nhiệm -menu:updateItem:atIndex:shouldCancel:.

Điều này sẽ cho phép bạn thay đổi trạng thái chế độ xem tùy chỉnh của mình trước khi mục menu được hiển thị, dựa trên trạng thái công cụ sửa đổi hiện tại.

Bạn có thể nhận các công cụ sửa đổi hiện tại bằng cách yêu cầu [[NSApp currentEvent] modifierFlags].

Nếu bạn cần phải được thông báo nếu cờ modifier thay đổi trong khi thực đơn của bạn đang mở, thực hiện các phương pháp -flagsChanged: trong giao diện tùy chỉnh của bạn:

- (void)flagsChanged:(NSEvent*)event 
{ 
    if ([event modifierFlags] & NSAlternateKeyMask) // check for option key 
    { 
     //do something 
    } 
    else 
    { 
     //do something else 
    } 
} 
+0

tôi cần nó xảy ra khi menu mở cửa. Giống như, không phải khi menu mở ra, nhưng trong khi nó được mở, nếu người dùng không chìa khóa với alt, sau đó tôi cần thông báo về nó. –

+0

Tôi đã cập nhật câu trả lời với thông tin về phương thức '-flagsChanged'. –

+0

Tôi overrode - (BOOL) chấp nhậnFirstResponder và - (BOOL) trở thànhFirstResponder để trả về YES trong các lớp xem tùy chỉnh của NSMenuItems của tôi. Sau đó tôi đã triển khai flagsChanged :. Tôi đã thực hiện lần xem đầu tiên của mục trình đơn đầu tiên khi menuNeedsUpdate: Tuy nhiên, flagsChanged: không được gọi là vẫn còn. Tôi cũng đã cố gắng có nó trở thành responder sau một sự chậm trễ 0,5 (trong chế độ vòng lặp theo dõi sự kiện), trong trường hợp bằng cách nào đó trình đơn đã lấy trộm nó trở lại. Điều đó cũng không hiệu quả. Ý tưởng nào? –

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