नहीं कहा गया है मेरे पास NSView
उप-वर्गीकृत है जो उप-वर्गीकृत NSDocument
की .xib-file का हिस्सा है, जो NSDocumentController
की openDocument:
विधि के डिफ़ॉल्ट व्यवहार से जीवित हो जाता है। इस subclassed NSView
में मैंने awakeFromNib
विधियों को लागू किया है, जिसमें दृश्य NSWindow
setAcceptsMouseMovedEvents:YES
विधि कहा जाता है, और acceptsFirstMouse:
, जो YES
देता है। लेकिन मेरे mouseMoved:
मेरे उप-वर्गीकृत NSView
के विधि कार्यान्वयन को तब नहीं कहा जाता जब मैं माउस को उस पर ले जाता हूं। क्या समस्या हो सकती है?माउस को
माउस को
उत्तर
मैंने वास्तविक परियोजना में mouseMoved:
का उपयोग नहीं किया है (मैंने अभी इसके साथ थोड़ा सा खेला है)। जहां तक मैं कह सकता हूं, mouseMoved:
केवल तभी कॉल किया जाता है जब आपका विचार पहला उत्तरदाता होता है और तब न केवल माउस आपके दृश्य पर होता है, बल्कि जब माउस चलता है। आप एक NSTrackingArea का उपयोग कर बेहतर हो सकता है। अधिक जानकारी के लिए Cocoa Event Handling Guide देखें।
mouseMoved घटना का अनुरोध करने के लिए सुनिश्चित भेज दिया जाता है रहें:
NSTrackingAreaOptions options = (NSTrackingActiveAlways | NSTrackingInVisibleRect |
NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved);
NSTrackingArea *area = [[NSTrackingArea alloc] initWithRect:[self bounds]
options:options
owner:self
userInfo:nil];
एक नोट। मुझे यकीन नहीं है कि यह एक इंट बल्कि एक एनएसआईएनटेगर प्रकार या टाइपपीफ अधिमानतः एनएसटीकिंग एरियाऑप्शन होना चाहिए जो असीम रूप से अधिक पठनीय और सही प्रकार के होने की गारंटी है। – uchuugaka
यह वास्तव में सही जवाब है –
बस बैठाना किसी और को इस में चलाता है। मैं एक ऐसे मुद्दे में भाग गया जहां मैं उप-वर्ग को उप-वर्गीकृत कर रहा था और दोनों वर्गों (दो अलग-अलग कारणों से) में एक ट्रैकिंग क्षेत्र जोड़ने की कोशिश कर रहा था।
यदि आप ऐसा कुछ कर रहे हैं, तो आपको यह सुनिश्चित करना होगा कि आपके mouseMoved:
, आदि सुपर में कॉल करें, या केवल आपके उप-वर्गों में से एक संदेश प्राप्त होगा।
- (void) mouseMoved: (NSEvent*) theEvent
{
// Call the super event
[super mouseMoved: theEvent];
}
दूसरों के द्वारा बताया गया है, एक NSTrackingArea
एक अच्छा समाधान है, और एक उपयुक्त जगह स्थापित करने के लिए ट्रैकिंग क्षेत्र NSView.updateTrackingAreas()
है। NSWindow की setAcceptsMouseMovedEvents
संपत्ति को सेट करना आवश्यक नहीं है।
स्विफ्ट 3 में:
class CustomView : NSView {
var trackingArea : NSTrackingArea?
override func updateTrackingAreas() {
if trackingArea != nil {
self.removeTrackingArea(trackingArea!)
}
let options : NSTrackingAreaOptions =
[.activeWhenFirstResponder, .mouseMoved ]
trackingArea = NSTrackingArea(rect: self.bounds, options: options,
owner: self, userInfo: nil)
self.addTrackingArea(trackingArea!)
}
override func mouseMoved(with event: NSEvent) {
Swift.print("Mouse moved: \(event)")
}
}
आपके उपयोग के मामले के आधार पर आप mouseDragged उपयोग करने में सक्षम हो सकता है। यह एक NSTrackingArea के बिना काम करता है, लेकिन अगर माउस नीचे है तो यह केवल आग लगती है। –