2012-06-10 21 views
5

एक सबव्यू (child) के साथ एक दृश्य (parent) पर विचार करें। दोनों ड्रैग किए गए प्रकार NSFilenamesPboardType के लिए पंजीकृत हैं।उप-दृश्य ड्रैग गंतव्य के रूप में यदि सबव्यू इसे अस्वीकार करता है

parent केवल ऑडियो फ़ाइलों में छवि फ़ाइलों और child में रुचि रखते हैं। यदि वे draggingEntered: में इसी प्रकार की फ़ाइल का पता लगाते हैं तो वे NSDragOperationCopy लौटाते हैं। यदि नहीं, तो वे NSDragOperationNone लौटते हैं।

childparent overlaps और जब एक खींचें child तक पहुँच जाता है, parent एक draggingExited: संदेश प्राप्त करता है, अगर child कोई बात नहीं खींचें या नहीं में रुचि रखता है।

parentchild को नहीं चाहते हैं तो मैं ड्रैग प्राप्त कैसे कर सकता हूं?

+0

क्या 'बच्चे 'को हमेशा' ड्रैगिंग 'मिलता है:' माता-पिता 'को' ड्रैगिंग 'प्राप्त करने से पहले, इस मामले में? (या इसके विपरीत, हमेशा?) यह जानना महत्वपूर्ण है कि घटनाओं का क्रम 100% सुसंगत है या नहीं।यदि यह 100% संगत नहीं है, तो यह समाधान थोड़ा और जटिल बनाता है। – MechEthan

+0

क्या विचारों के लेआउट को दिखाते हुए एक साधारण छवि/योजनाबद्ध साझा करना संभव है? – Alladinian

उत्तर

3

अगर मैं यह अधिकार आपको बुलाना चाहिए मिलती है:

[self.superview yourmethod]; 
बच्चे समारोह में

बच्चे माता-पिता से विरासत में मिला है तो आप कॉल कर सकते हैं:

[super yourmethod]; 
+0

'yourmethod' क्या है? – strangetimes

2

रहे हैं चीजें आप यहाँ क्या कर सकता है की एक जोड़ी:

  1. @Thomas उल्लेख किया है, आप में तर्क को लागू कर सकता है बच्चा यह निर्धारित करने के लिए देखता है कि ड्रैग ईवेंट को मूल दृश्य में अग्रेषित किया जाना चाहिए या उचित होने पर ईवेंट को अग्रेषित करना चाहिए।

  2. आप ड्रैग संदेशों ([childView unregisterDraggedTypes]) प्राप्त करने से बच्चे के दृश्य को अनधिकृत कर सकते हैं और फिर आप parentView में ड्रैग के लिए सभी तर्क लागू कर सकते हैं। अनिवार्य रूप से, विचार ड्रैग के प्रकार और स्थिति की गणना करना होगा और चाहे वह बच्चे के दृश्य के साथ छेड़छाड़ करे या नहीं। यदि यह बच्चे के दृश्य से छेड़छाड़ करता है, तो बच्चे के दृश्य के लिए ड्रैग तर्क लागू करें। अन्यथा, मूल दृश्य के लिए ड्रैग तर्क लागू करें। इसे पूरा करने के लिए आपको शायद draggingUpdated: लागू करने की आवश्यकता होगी।

1

आप माता-पिता को केवल एकमात्र ऐसा मान सकते हैं जो NSFilenamesPboardType के लिए पंजीकृत है।

और UIResponderChain की तरह, प्रत्येक subviews

- (NSView*) dragTest:(id<NSDraggingInfo>)sender; 

के लिए एक वर्ग बनाने यदि दिए गए मान नहीं के बराबर है, इसका मतलब है subview (और इसके subivews) खींचें घटना को संभालने के लिए इच्छा नहीं है।

अब वापस खींचने के दौरान, पेरेंटव्यू पर वापस जाएं: ट्रिगर किया गया, स्थान की गणना करें और पता लगाएं कि यह किस पर है, ड्रैगटेस्ट पर कॉल करें: यह जांचने के लिए कि संबंधित सबव्यू इसे संभालने की इच्छा है या नहीं। घटना को संभालने के लिए लौटाए गए गैर-शून्य दृश्य को छोड़ दें, अन्यथा इसे अभिभावक में संभाल लें।

यदि आपके पास कई स्तर के सबव्यूव्यू हैं तो यह विधि उपयोगी होगी।