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.
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
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
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