2011-09-25 10 views
10

नहीं कहा गया है मेरे पास NSView उप-वर्गीकृत है जो उप-वर्गीकृत NSDocument की .xib-file का हिस्सा है, जो NSDocumentController की openDocument: विधि के डिफ़ॉल्ट व्यवहार से जीवित हो जाता है। इस subclassed NSView में मैंने awakeFromNib विधियों को लागू किया है, जिसमें दृश्य NSWindowsetAcceptsMouseMovedEvents:YES विधि कहा जाता है, और acceptsFirstMouse:, जो YES देता है। लेकिन मेरे mouseMoved: मेरे उप-वर्गीकृत NSView के विधि कार्यान्वयन को तब नहीं कहा जाता जब मैं माउस को उस पर ले जाता हूं। क्या समस्या हो सकती है?माउस को

+0

आपके उपयोग के मामले के आधार पर आप mouseDragged उपयोग करने में सक्षम हो सकता है। यह एक NSTrackingArea के बिना काम करता है, लेकिन अगर माउस नीचे है तो यह केवल आग लगती है। –

उत्तर

10

मैंने वास्तविक परियोजना में mouseMoved: का उपयोग नहीं किया है (मैंने अभी इसके साथ थोड़ा सा खेला है)। जहां तक ​​मैं कह सकता हूं, mouseMoved: केवल तभी कॉल किया जाता है जब आपका विचार पहला उत्तरदाता होता है और तब न केवल माउस आपके दृश्य पर होता है, बल्कि जब माउस चलता है। आप एक NSTrackingArea का उपयोग कर बेहतर हो सकता है। अधिक जानकारी के लिए Cocoa Event Handling Guide देखें।

+0

यह वास्तव में सवाल का जवाब नहीं देता है। – uchuugaka

+0

नीचे देखें। इन घटनाओं को प्राप्त करने के लिए आपको एक ट्रैकिंग क्षेत्र स्थापित करना होगा। – uchuugaka

19

mouseMoved घटना का अनुरोध करने के लिए सुनिश्चित भेज दिया जाता है रहें:

NSTrackingAreaOptions options = (NSTrackingActiveAlways | NSTrackingInVisibleRect | 
         NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved); 

NSTrackingArea *area = [[NSTrackingArea alloc] initWithRect:[self bounds] 
                options:options 
                 owner:self 
                userInfo:nil]; 
+0

एक नोट। मुझे यकीन नहीं है कि यह एक इंट बल्कि एक एनएसआईएनटेगर प्रकार या टाइपपीफ अधिमानतः एनएसटीकिंग एरियाऑप्शन होना चाहिए जो असीम रूप से अधिक पठनीय और सही प्रकार के होने की गारंटी है। – uchuugaka

+0

यह वास्तव में सही जवाब है –

1

बस बैठाना किसी और को इस में चलाता है। मैं एक ऐसे मुद्दे में भाग गया जहां मैं उप-वर्ग को उप-वर्गीकृत कर रहा था और दोनों वर्गों (दो अलग-अलग कारणों से) में एक ट्रैकिंग क्षेत्र जोड़ने की कोशिश कर रहा था।

यदि आप ऐसा कुछ कर रहे हैं, तो आपको यह सुनिश्चित करना होगा कि आपके mouseMoved:, आदि सुपर में कॉल करें, या केवल आपके उप-वर्गों में से एक संदेश प्राप्त होगा।

- (void) mouseMoved: (NSEvent*) theEvent 
{ 
    // Call the super event 
    [super mouseMoved: theEvent]; 
} 
2

दूसरों के द्वारा बताया गया है, एक 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)") 
    } 
}