6

मैं एक कस्टम दृश्य लिख रहा हूं जिसे फ़ोल्डर बूंदों को स्वीकार करने की आवश्यकता है। शर्त है: केवल निर्देशिका स्वीकार की जाती है, इसलिए जब उपयोगकर्ता फ़ाइल को ड्रैग करता है तो कुछ भी नहीं होना चाहिए।खींचें और छोड़ें - केवल फ़ोल्डर्स स्वीकृत

मैं साथ मेरे विचार पंजीकृत कर लिया है:

[self registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]]; 

और बुनियादी खींचने प्रोटोकॉल तरीकों को पहले से ही लागू किया जाता है। परीक्षण प्रयोजनों के लिए:

- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)sender 
{ 
    NSLog("@Drag Entered"); 
    return NSDragOperationCopy; 
} 

- (NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)sender 
{ 
    return NSDragOperationCopy; 
} 

- (void)draggingExited:(id<NSDraggingInfo>)sender 
{ 
    NSLog(@"Dragging Exited"); 
} 

- (BOOL)prepareForDragOperation:(id<NSDraggingInfo>)sender { return YES; } 
- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender { return YES; } 

तो यह लगभग सही ढंग से काम करता है: जब दृश्य में खींच कर्सर के लिए धन चिह्न हो जाता है। हालांकि मैं इससे बचना चाहूंगा कि आइटम एक नियमित फाइल है।

मैं शायद कि NSFileManager साथ (हालांकि मुझे आश्चर्य है कि अगर वहाँ एक आसान तरीका है) एक बार मैं घसीटा पथ मिलता है, लेकिन सवाल यह है कि जहां करने की आवश्यकता होगी। मैंने बिना किसी सफलता के NSDragOperationNone लौटने की विधि draggingEntered: विधि में परीक्षण अधिकार शामिल करने का प्रयास किया है। मैं एप्पल प्रलेखन से एक टुकड़ा अनुसरण कर रहा हूं:

{ 
    NSPasteboard *pboard = [sender draggingPasteboard]; 

    if ([[pboard types] containsObject:NSFilenamesPboardType]) { 
     NSArray *files = [pboard propertyListForType:NSFilenamesPboardType]; 
     int numberOfFiles = [files count]; 
     // Perform operation using the list of files 
    } 
    return YES; 
} 

मैं कहाँ इस परीक्षण को लागू करना चाहिए, ताकि कर्सर ही रहता है, तो एक फ़ाइल के बजाय घसीटा जाता है?

उत्तर

6

आपको -draggingEntered: में परीक्षण लागू करना चाहिए और पेस्टबोर्ड में फ़ाइल होने पर NSDragOperationNone लौटाएं।

हालांकि, बाद से आप भी ‑draggingUpdated: को लागू किया है, तो आप उस विधि को भी करने के लिए फ़ोल्डर प्रकार के लिए परीक्षण जोड़ने की आवश्यकता होगी।

वर्तमान में आप हमेशा फ़ाइल प्रकार, जिसका मतलब है कि जैसे ही अपने खींच गंतव्य के अंदर माउस चालें के रूप में, कर्सर एक प्रति कर्सर को कोई फर्क नहीं पड़ता कि तुम क्या ‑draggingEntered: में क्या बदल जाएगा के लिए परीक्षण के बिना ‑draggingUpdated: में NSDragOperationCopy लौट रहे हैं ।

ध्यान दें कि ‑draggingUpdated: लागू करना वैकल्पिक है। यदि आप कई संभावित ड्रैगिंग गंतव्यों के साथ जटिल दृश्य लागू नहीं कर रहे हैं तो आपको इसे लागू करने की आवश्यकता नहीं है, बस ‑draggingEntered: और ‑draggingExited:

+0

ओह मैन, जैसा कि मैंने पाठ में कहा था, मैंने पहले से ही 'ड्रैगिंगएन्टर:' में परीक्षण लागू किया था, लेकिन 'ड्रैगिंग अपडेटेड:' के साथ बिंदु को याद किया। बस इसे हटा दिया। आपका बहुत बहुत धन्यवाद! – sidyll

+0

आदर्श रूप से, एक अलग विधि में, बिल्कुल एक बार परीक्षण को कार्यान्वित करें, और अपने आप को उस संदेश को 'ड्रैगिंगइंटर:' और 'ड्रैगिंग अपडेटेड:' से भेजें। –

संबंधित मुद्दे