2012-06-22 13 views
6

Tôi muốn đặt khóa tương đương "" (dấu cách) mà không có bất kỳ công cụ sửa đổi nào cho NSMenuItem (trong Menu chính của ứng dụng).Lỗi NSMenuItem KeyEquivalent "" (không gian)

Như sau từ tài liệu:

Ví dụ, trong một ứng dụng mà đóng phương tiện truyền thông, lệnh Chơi thể được ánh xạ tới chỉ “” (không gian), nếu không có sự chủ chốt lệnh. Bạn có thể thực hiện việc này bằng mã sau:

[menuItem setKeyEquivalent: @ ""];

[menuItem setKeyEquivalentModifierMask: 0];

Bộ tương đương chính thành công nhưng không hoạt động. Khi tôi nhấn phím "Không gian" mà không có công cụ sửa đổi nào không xảy ra, nhưng nó hoạt động khi tôi nhấn "Space" bằng phím bổ trợ "Fn".

Tôi cần sử dụng "Không gian" mà không có công cụ sửa đổi. Xin vui lòng giúp đỡ!

Trả lời

3

Tôi đã gặp vấn đề tương tự. Tôi đã không điều tra rất khó, nhưng như xa như tôi có thể nói, phím dài không "nhìn" giống như một phím tắt để Cocoa để nó được chuyển đến -insertText:. Giải pháp của tôi là để phân lớp các NSWindow, bắt nó khi nó đi lên chuỗi trả lời (có lẽ bạn có thể phân lớp NSApp thay), và gửi nó đi để hệ thống menu một cách rõ ràng:

- (void)insertText:(id)insertString 
{ 
    if ([insertString isEqual:@" "]) { 
     NSEvent *fakeEvent = [NSEvent keyEventWithType:NSKeyDown 
               location:[self mouseLocationOutsideOfEventStream] 
             modifierFlags:0 
              timestamp:[[NSProcessInfo processInfo] systemUptime] 
              windowNumber:self.windowNumber 
               context:[NSGraphicsContext currentContext] 
              characters:@" " 
          charactersIgnoringModifiers:@" " 
              isARepeat:NO 
               keyCode:49]; 
     [[NSApp mainMenu] performKeyEquivalent:fakeEvent]; 
    } else { 
     [super insertText:insertString]; 
    } 
} 
+0

Cảm ơn bạn trả lời, nó hoạt động) – Kira

1

Tôi vừa được trải qua cùng vấn đề với một twist ...

Phím tương thích phím cách hoạt động tốt trong ứng dụng của tôi trong khi IBAction được liên kết của NSMenuItem nằm trong App Delegate.

Nếu tôi di chuyển IBAction vào bộ điều khiển chuyên dụng thì không thành công. Tất cả các mục tương đương của mục trình đơn khác tiếp tục hoạt động nhưng phím cách không phản hồi (nó là ok với một phím bổ trợ, nhưng chưa sửa đổi @ "" sẽ không hoạt động).

Tôi đã thử các cách giải quyết khác nhau, như liên kết trực tiếp với bộ điều khiển so với liên kết qua chuỗi trả lời, không có kết quả. Tôi đã thử các cách mã:

[menuItem setKeyEquivalent:@" "]; 
[menuItem setKeyEquivalentModifierMask:0]; 

và cách Interface Builder, hành vi là như nhau

Tôi đã thử subclassing NSWindow, như mỗi câu trả lời của Justin, nhưng cho đến nay đã thất bại trong việc nhận được rằng để làm việc.

Vì vậy, bây giờ tôi đã đầu hàng và di dời IBAction này cho App Delegate nơi nó hoạt động. Tôi không coi đây là một giải pháp, chỉ cần làm ... có lẽ đó là một lỗi, hoặc (nhiều khả năng) Tôi chỉ không hiểu tin nhắn sự kiện và chuỗi trả lời cũng đủ.

1

Bài đăng này vì tôi cũng cần sử dụng không gian nhưng không có giải pháp nào phù hợp với tôi.

Vì vậy, I subclass NSApplication và sử dụng bộ chọn sendEvent: với justin k solution:

- (void)sendEvent:(NSEvent *)anEvent 
{ 
    [super sendEvent:anEvent]; 
    switch ([anEvent type]) { 
    case NSKeyDown: 
     if (([anEvent keyCode] == 49) && (![anEvent isARepeat])) { 

      NSPoint pt; pt.x = pt.y = 0; 
      NSEvent *fakeEvent = [NSEvent keyEventWithType:NSKeyDown 
                location:pt 
              modifierFlags:0 
               timestamp:[[NSProcessInfo processInfo] systemUptime] 
               windowNumber: 0 // self.windowNumber 
                context:[NSGraphicsContext currentContext] 
               characters:@" " 
           charactersIgnoringModifiers:@" " 
               isARepeat:NO 
                keyCode:49]; 
      [[NSApp mainMenu] performKeyEquivalent:fakeEvent]; 
     } 
     break; 

    default: 
     break; 
    } 
} 

Hy vọng nó sẽ giúp

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