2009-09-08 32 views
7

Tôi có một NSMenu bật ra khỏi một NSStatusItem bằng cách sử dụng popUpStatusItemMenu. Các NSMenuItem này hiển thị một loạt các liên kết khác nhau và mỗi liên kết được kết nối với setAction: với phương thức openLink: của một đích. Sự sắp xếp này đã hoạt động tốt trong một thời gian dài. Người dùng chọn một liên kết từ trình đơn và phương thức openLink: sau đó giao dịch với nó.NSView tùy chỉnh trong NSMenuItem không nhận được sự kiện chuột

Thật không may, gần đây tôi đã quyết định thử nghiệm bằng cách sử dụng phương thức setView: của NSMenuItem để cung cấp giao diện đẹp hơn/slicker. Về cơ bản, tôi chỉ dừng thiết lập tiêu đề, tạo NSMenuItem, và sau đó sử dụng setView: để hiển thị một khung nhìn tùy chỉnh. Điều này hoạt động hoàn hảo, các mục menu trông tuyệt vời và chế độ xem tùy chỉnh của tôi được hiển thị.

Tuy nhiên, khi người dùng chọn mục menu và nhả chuột, thao tác không còn hoạt động nữa (tức là, openLink: không được gọi). Nếu tôi chỉ đơn giản là bình luận ra setView: cuộc gọi, sau đó các hành động làm việc một lần nữa (tất nhiên, các mục trình đơn trống, nhưng hành động được thực hiện đúng). Câu hỏi đầu tiên của tôi, sau đó, là lý do tại sao thiết lập một khung nhìn phá vỡ hành động của NSMenuItem.

Không sao, tôi nghĩ, tôi sẽ khắc phục sự cố bằng cách phát hiện sự kiện mouseUp trong chế độ xem tùy chỉnh của tôi và gọi phương thức hành động của tôi từ đó. Tôi đã thêm phương thức này vào chế độ xem tùy chỉnh của mình:

- (void)mouseUp:(NSEvent *)theEvent { 
    NSLog(@"in mouseUp"); 
    } 

Không súc sắc! Phương pháp này không bao giờ được gọi.

Tôi có thể đặt các tuyến theo dõi và nhận chuộtNhập: các sự kiện. Tôi đặt một vài bài kiểm tra trong thói quen mouseEntered tôi, như sau:

if ([[self window] ignoresMouseEvents]) { NSLog(@"ignoring mouse events"); } 
else { NSLog(@"not ignoring mouse events"); } 
if ([[self window] canBecomeKeyWindow]) { dNSLog((@"canBecomeKeyWindow")); } 
else { NSLog(@"not canBecomeKeyWindow"); } 
if ([[self window] isKeyWindow]) { dNSLog((@"isKeyWindow")); } 
else { NSLog(@"not isKeyWindow"); } 

Và có các câu trả lời sau đây:

not ignoring mouse events 
canBecomeKeyWindow 
not isKeyWindow 

Đây có phải là vấn đề? "not isKeyWindow"? Có lẽ điều này không tốt vì tài liệu của Apple nói "Nếu người dùng nhấp vào chế độ xem không có trong cửa sổ chính, theo mặc định, cửa sổ sẽ được chuyển tiếp và tạo khóa nhưng sự kiện chuột sẽ không được gửi đi". Nhưng phải có một cách để phát hiện những sự kiện này. LÀM SAO?

Thêm:

[[self window] makeKeyWindow]; 

không có tác dụng, mặc dù thực tế rằng canBecomeKeyWindow là YES.

+0

Có thêm thông tin về vấn đề này tại radar mở: http://openradar.appspot.com/7128269 Ngoài ra còn có một cách giải quyết tuyên bố, nhưng tôi không thể làm cho công tác khắc phục. Về cơ bản cửa sổ chỉ từ chối trở thành chìa khóa, mặc dù nó báo cáo canBecomeKey. – Dennis

+0

Xin chào, tôi đã gặp phải vấn đề tương tự, bạn có tiến bộ gì với nó không? Tôi đã thử một số cách để giải quyết nó, tôi đã tìm thấy một cách giải quyết nhưng xấu xí khủng khiếp của nó, và sau khi hiển thị menu thanh trạng thái menu không được đánh dấu, nhưng menu được hiển thị và đầy đủ chức năng. Tôi đã đặt menu cho mục trạng thái thành không và tự kiểm soát popup menu. Nếu ứng dụng đang hoạt động, tôi chỉ cần gọi phương thức popup menu, nếu không có tôi gửi tin nhắn hoạt động ứng dụng, và trong gọi lại tôi đang mở menu. Đây là một số mã. Một lần nữa khủng khiếp và xấu xí của nó. http://gist.github.com/224275 – iafonov

+0

Tôi phải nói rằng mã của iafonov là TUYỆT VỜI! Mặc dù một năm trước !!! Mặc dù mã có vẻ không liên quan. Cảm ơn! Nó giải quyết tất cả các vấn đề về NSVIew, NSTextEdit trong NSMenuItem. Lúc đầu, NSTextEdit (trong NSMenuItem) không hoạt động bình thường, không thể nhận được nhấn phím và chuột không thay đổi, Bây giờ mọi thứ hoạt động tuyệt vời !!! Không chấp nhậnFirstResponder, Không có cửa sổ tự makeFirstResponder: xxx, Just iafonov'code. Đó là cách để bật lên trình đơn quan trọng. http://gist.github.com/224275 – user377808

Trả lời

9

Thêm phần này vào giao diện tùy chỉnh của bạn và bạn nên sử dụng tốt:

- (BOOL)acceptsFirstMouse:(NSEvent *)theEvent 
{ 
    return YES; 
} 
+1

Đã hoạt động, cảm ơn! – Vojto

4

tôi đã thêm phương pháp này để xem tùy chỉnh của tôi, và bây giờ mọi thứ hoạt động đẹp:

- (void)viewDidMoveToWindow { 
    [[self window] becomeKeyWindow]; 
} 

Hope this helps!

12

Thêm phương pháp này để tùy chỉnh của bạn NSView và nó sẽ hoạt động tốt với các sự kiện chuột

- (void)mouseUp:(NSEvent*) event { 
    NSMenuItem* mitem = [self enclosingMenuItem]; 
    NSMenu* m = [mitem menu]; 
    [m cancelTracking]; 
    [m performActionForItemAtIndex: [m indexOfItem: mitem]]; 
} 

Nhưng tôi đang gặp vấn đề với keyhandling, nếu bạn giải quyết vấn đề này có lẽ bạn có thể vào câu hỏi của tôi và giúp tôi một chút.

+0

Đây là giải pháp cho tôi! Cảm ơn! – kdbdallas

+0

Wow, tôi đã dành nửa ngày để tìm ra điều này. Cảm ơn – Cory

-1

Gần đây tôi cần hiển thị Chế độ xem tùy chỉnh cho một NSStatusItem, hiển thị NSMenu thông thường khi nhấp vào nó và hỗ trợ thao tác kéo và thả trên biểu tượng Trạng thái.

Tôi đã giải quyết được vấn đề của mình bằng cách sử dụng, chủ yếu là ba nguồn khác nhau có thể được tìm thấy trong câu hỏi this.

Hy vọng nó sẽ giúp người khác.

-1

Xem mã mẫu từ Apple có tên CustomMenus Trong đó bạn sẽ tìm thấy một ví dụ điển hình trong lớp ImagePickerMenuItemView.

Không đơn giản hoặc tầm thường để thực hiện chế độ xem trong menu hoạt động như NSMenuItem bình thường. Có một số quyết định thực sự và mã hóa cần làm.

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