2012-04-25 19 views
10

से ड्रैग और ड्रॉप करें मैं फाइंडर से ड्रैग और ड्रॉप को अपने ऐप के एनएसटीबल व्यू में लागू करने की कोशिश कर रहा हूं। सेटअप NSTableView का उपयोग करता है, एक सरणी नियंत्रक जो कोर डेटा स्टोर में कोको बाइंडिंग का उपयोग करके डेटास्रोत के रूप में कार्य करता है।एनएसटीबल व्यू और फाइंडर

मैं निम्नलिखित, मूल रूप से विभिन्न ब्लॉग पोस्ट मैं पर पाया अतः और अन्य साइटों निम्नलिखित किया:

मेरे विचार नियंत्रक के awakeFromNib में मैं फोन:

[[self sourcesTableView] registerForDraggedTypes:[NSArray arrayWithObjects: NSPasteboardTypePNG, nil]]; 

मैं NSArrayController subclassed और निम्नलिखित जोड़ा मेरे सबक्लास के लिए विधियां (सबक्लासिंग के लिए तर्क यह है कि सरणी नियंत्रक को ड्रॉप के बारे में सूचित किया जाना चाहिए क्योंकि यह तालिका दृश्य के डेटासोर्स के रूप में कार्य करता है):

- (BOOL) tableView: (NSTableView *) aTableView acceptDrop: (id <NSDraggingInfo>) info row: (NSInteger) row dropOperation: (NSTableViewDropOperation)operation 

उपरोक्त के लिए मेरा कार्यान्वयन वर्तमान में केवल लॉग को लिखता है और फिर एक बूलियन हाँ देता है।

- (NSDragOperation) tableView: (NSTableView *) aTableView validateDrop: (id <NSDraggingInfo>) info proposedRow: (NSInteger) row proposedDropOperation: (NSTableViewDropOperation) operation 

आईबी में मेरे पास मेरे कस्टम एनएसएआरए कंट्रोलर उप-वर्ग को इंगित करने वाला सरणी नियंत्रक है।

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

उत्तर

17

खोजक से एक ड्रैग हमेशा एक फ़ाइल ड्रैग होता है, न कि छवि खींचें। आपको खोजक से यूआरएल खींचने का समर्थन करना होगा।

[[self sourcesTableView] registerForDraggedTypes:[NSArray arrayWithObject:(NSString*)kUTTypeFileURL]]; 

तुम इतनी तरह फ़ाइलें सत्यापित कर सकते हैं::

- (NSDragOperation)tableView:(NSTableView *)aTableView validateDrop:(id <NSDraggingInfo>)info proposedRow:(NSInteger)row proposedDropOperation:(NSTableViewDropOperation)operation 
{ 
    //get the file URLs from the pasteboard 
    NSPasteboard* pb = info.draggingPasteboard; 

    //list the file type UTIs we want to accept 
    NSArray* acceptedTypes = [NSArray arrayWithObject:(NSString*)kUTTypeImage]; 

    NSArray* urls = [pb readObjectsForClasses:[NSArray arrayWithObject:[NSURL class]] 
    options:[NSDictionary dictionaryWithObjectsAndKeys: 
       [NSNumber numberWithBool:YES],NSPasteboardURLReadingFileURLsOnlyKey, 
       acceptedTypes, NSPasteboardURLReadingContentsConformToTypesKey, 
       nil]]; 

    //only allow drag if there is exactly one file 
    if(urls.count != 1) 
     return NSDragOperationNone; 

    return NSDragOperationCopy; 
} 

उसके बाद आप URL फिर से निकालने के लिए की आवश्यकता होगी

कि ऐसा करने के लिए, आप घोषित करने के लिए है कि आप URL प्रकार चाहते हैं की जरूरत है जब tableView:acceptDrop:row:dropOperation: विधि कहा जाता है, तो URL से एक छवि बनाएं और फिर उस छवि के साथ कुछ करें।

भले ही आप कोको बाइंडिंग का उपयोग कर रहे हैं, तो आप अभी भी प्रदान करेगा और आपके NSTableView की datasource के रूप में एक वस्तु को लागू आप खींच तरीकों का उपयोग करना चाहते हैं की जरूरत है। NSTableView उप-वर्गीकरण अच्छा नहीं होगा क्योंकि डेटास्रोत विधियों को NSTableView में लागू नहीं किया गया है।

आपको केवल अपने डेटासोर्स ऑब्जेक्ट में ड्रैगिंग-संबंधित विधियों को लागू करने की आवश्यकता है, न कि तालिका डेटा प्रदान करने वाले, जो आप इसे करने के लिए बाइंडिंग का उपयोग कर रहे हैं। ड्रॉप के परिणाम के सरणी नियंत्रक को सूचित करने की आपकी ज़िम्मेदारी है, या तो NSArrayController विधियों जैसे insertObject:atArrangedObjectIndex: या कुंजी-मूल्य कोडिंग-अनुपालन एक्सेसर विधियों का उपयोग करके बैकिंग सरणी को संशोधित करके।

+0

धन्यवाद, लेकिन तालिका दृश्य अभी भी किसी भी ड्रैग/बूंद को स्वीकार नहीं करता है। फ़ाइंडर से खींचने वाली कोई भी फ़ाइल वापस उछालती है .... मैं कोको बाइंडिंग का उपयोग तालिका को अपने डेटा स्रोत से संलग्न करने के लिए करता हूं। – Roger

+0

मैंने अपना जवाब अपडेट कर दिया है। आपको अभी भी डेटासॉर ऑब्जेक्ट को लागू करने की आवश्यकता है। –

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