मुझे इसी तरह की आवश्यकताएं थीं, सिवाय इसके कि मेरे पास ऑब्जेक्ट्स का ग्रिड था जिसे मैं चयनित ऑब्जेक्ट को नए स्थान पर खींचकर पुनर्व्यवस्थित करना चाहता था।ऐसा करने के कई तरीके हैं, जिसमें कस्टम ऑब्जेक्ट बनाने और NSPasteboardWriting
और NSPasteboardReading
प्रोटोकॉल को कार्यान्वित करने, और प्रोटोकॉल को लागू करने के कई तरीके हैं, यदि आप NSPasteboardReadingAsKeyedArchive
के रूप में डेटा पढ़ रहे होंगे), लेकिन ऐसा लगता है कि यह उन वस्तुओं को खींचने के लिए अधिक है जो आंतरिक हैं आवेदन।
मैंने कस्टम यूटीआई प्रकार के साथ एक रैपर के रूप में NSPasteboardItem
का उपयोग करना शामिल किया है (यह पहले से ही NSPasteboardWriting
और NSPasteboardReading
प्रोटोकॉल लागू करता है)।
#define kUTIMyCustomType @“com.mycompany.MyApp.MyCustomType”
यह 'com.domain.MyApp' प्रारूप में परिभाषित करने की आवश्यकता अन्यथा आप फार्म की त्रुटियां मिलेंगी: "XXX एक वैध यूटीआई स्ट्रिंग नहीं है सबसे पहले एक कस्टम यूटीआई प्रकार की घोषणा। अमान्य यूटीआई के लिए डेटा सेट नहीं कर सकता। "ऐप्पल ने इसे अपने दस्तावेज में उल्लेख किया है।
फिर आपको इस कस्टम यूटीआई प्रकार को उस दृश्य में पंजीकृत करना होगा जिसमें आपका ड्रैगिंग होगा। यह रनटाइम पर किया जा सकता है, और किसी भी .plist जोड़ों की आवश्यकता नहीं है। अपने दृश्य के init विधि में निम्नलिखित जोड़ें:
[self registerForDraggedTypes:[NSArray arrayWithObjects:(NSString *)kUTIMyCustomType, nil]];
अब, यह सुनिश्चित करें कि प्रतिनिधि इस दृश्य के लिए सेट किया गया है, और प्रतिनिधि वस्तु को लागू करता है की आवश्यकता NSDraggingSource
और NSDraggingDestination
प्रोटोकॉल तरीकों। यह आपको एमवीसी डिज़ाइन पैटर्न को तोड़ने से रोकने के लिए अनुमति देगा, नामित नियंत्रक ऑब्जेक्ट को पेस्टबोर्ड पर डेटा रखने में संभाल करने की अनुमति देकर, जिसमें संभावित रूप से मॉडल डेटा (यानी, इंडेक्स) क्वेरी करना शामिल होगा।
विशेष रूप से, खींचने पर रखने वस्तुओं की अनुक्रमणिका पेस्टबोर्ड के लिए जब खींचकर ले जाया जा करने के लिए अपने सूचकांक आंकड़ों के NSPasteboardItem
रैपर के रूप में शुरू होता है:
- (void) draggingSession:(NSDraggingSession *)session willBeginAtPoint:(NSPoint)screenPoint
{
NSPasteboard * pboard = [NSPasteboard pasteboardWithName:NSDragPboard];
[pboard clearContents];
NSMutableArray * selectedIndexes = [NSMutableArray array];
// Add NSString indexes for dragged items to pasteboard in NSPasteboardItem wrappers.
for (MyModel * myModel in [self selectedObjects])
{
NSPasteboardItem * pasteboardItem = [[[NSPasteboardItem alloc] init] autorelease];
[pasteboardItem setString:[NSString stringWithFormat:@"%@", [myModel index]]
forType:kUTIMyCustomType];
[selectedIndexes addObject:pasteboardItem];
}
[pboard writeObjects:selectedIndexes];
}
और जब खींच आपरेशन पूरा करता है, घसीटा सूचकांक को पढ़ने के लिए NSPasteboardItem
डेटा:
- (BOOL) performDragOperation:(id <NSDraggingInfo>)sender
{
NSPasteboard * pasteboard = [sender draggingPasteboard];
// Check for custom NSPasteboardItem's which wrap our custom object indexes.
NSArray * classArray = [NSArray arrayWithObject:[NSPasteboardItem class]];
NSArray * items = [pasteboard readObjectsForClasses:classArray options:[NSDictionary dictionary]];
if (items == nil)
return NO;
// Convert array of NSPasteboardItem's with NSString index reps. to array of NSNumber indexes.
NSMutableArray * indexes = [NSMutableArray array];
for (NSPasteboardItem * item in items)
[indexes addObject:[NSNumber numberWithInteger:[[item stringForType:kUTIMyCustomType] integerValue]]];
//
// Handle dragged indexes…
//
return YES;
}
धन्यवाद, मैं प्रतिक्रिया की सराहना करता हूं। मैं अभी भी वास्तव में हैरान हूं कि पुन: व्यवस्थित पंक्तियों का ट्रैक रखने के लिए यह बहुत जटिल है। – livings124
मैंने एक ऑब्जेक्ट लागू किया जो 'NSPasteboardWriting' के अनुरूप है जो 'writableTypesForPasteboard:' के लिए मेरी कस्टम यूटीआई देता है, लेकिन मुझे मिल रहा है: _'TableViewDataType 'मान्य यूटीआई स्ट्रिंग नहीं है। क्लास TableViewDragNode._ – livings124
में लौटाए गए प्रकार के रूप में अमान्य यूटीआई का उपयोग नहीं कर सकता: यदि ऐसा है तो मुझे नहीं लगता कि आपके पास आपके Info.plist में आपके ड्रैग ऑपरेशंस के लिए एक कस्टम यूटीआई घोषित करने के अलावा कोई विकल्प नहीं है। मैं मानता हूं, यह एक अजीब सीमा प्रतीत होता है। मुझे विश्वास नहीं है कि रनटाइम पर यूटीआई को परिभाषित करना संभव है, इसे Info.plist में हार्ड-कोड किया जाना चाहिए। –