5

मेरे पास समृद्ध टेक्स्ट और ग्राफिक्स सक्षम (आईबी में) के साथ एक मूल NSTextView है। जो मैं प्राप्त करना चाहता हूं वह किसी भी छवि के पथ और फ़ाइल नाम को खींच लिया गया है ताकि मैं उन्हें किसी अन्य वर्ग में पास कर सकूं।NSAttributedString में nsfilewrapper/nstextattachment से फ़ाइल नाम और पथ प्राप्त करना

मैं एनएसएट्रिब्यूटेड स्ट्रिंग के लिए नया हूं लेकिन मुझे enumerateAttributesInRange:options:usingBlock: का उपयोग करके लूप मिला है NSAttachmentAttributeName और यह सब ठीक काम कर रहा है। लेकिन गहराई से जा रहा है, मैं फ़ाइल रैपर वर्ग में जाता हूं और यह apparent inability to give me the path of the item है।

मैं NSTextAttachment का नाम और पथ कैसे प्राप्त करूंगा?

संबंधित: क्या गुणों के माध्यम से सभी को आगे बढ़ाने का कोई आसान तरीका है?

बहुत बहुत धन्यवाद!

+0

दुर्भाग्यवश NSFileWrapper द्वारा लौटाए गए विशेषता शब्दकोश पूर्ण पथनाम प्रदान नहीं करते हैं। NSFileWrapper का डिज़ाइन मूल संदर्भ ऑब्जेक्ट के पथनाम तक पहुंच प्रदान करने के लिए अस्वीकार करके मायोपिक और दुर्भाग्यपूर्ण encapsulation मान्यताओं बनाता है। – ctpenrose

उत्तर

8

जबकि मैं व्यक्तिगत रूप से अवमानना ​​में NSFileWrapper का डिज़ाइन रखता हूं, यदि आपको केवल प्रत्येक अनुलग्नक के डेटा की आवश्यकता है तो आप NSFileWrapper की regularFileContents विधि के माध्यम से इसे एनएसडीएटी इंस्टेंस के रूप में एक्सेस कर सकते हैं। हालांकि, मुझे अपने आवेदन के लिए अनुलग्नक के लिए एक वैध और स्पष्ट पथनाम की आवश्यकता थी।

आप अपने NSTextView उपवर्ग और NSDraggingDestination प्रोटोकॉल विधि draggingEntered: ओवरराइड और आप खींच आपरेशन के दौरान NSPasteboardItem वस्तुओं आपके आवेदन के लिए पारित पार कर सकते हैं कर सकते हैं: यह बहुत ज्यादा काम की तुलना में यह होना चाहिए प्राप्त करने के लिए। मैंने पथनाम और उसके इनोड नंबर को एनएसएमयूटेबल डिक्शनरी में रखना चुना है, क्योंकि NSFileWrapper आपको संदर्भित फ़ाइल के इनोड प्रदान कर सकता है। बाद में, जब मैं NSAextributedString के माध्यम से NSTextView सामग्री तक पहुंचता हूं, तो मैं इंडेक्स के रूप में इनोड का उपयोग करके अनुलग्नक का पथनाम प्राप्त कर सकता हूं। मेरी समाधान, कि मेरे आवेदन को प्रभावित नहीं करता साथ

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender { 

    // get pasteboard from dragging operation 

    NSPasteboard *pasteboard = [sender draggingPasteboard]; 

    NSArray *pasteboardItems = [pasteboard pasteboardItems]; 

    for (NSPasteboardItem *pasteboardItem in pasteboardItems) { 

     // look for a file url type from the pasteboard item 

     NSString *draggedURLString = [pasteboardItem stringForType:@"public.file-url"]; 

     if (draggedURLString != nil) { 

      NSURL *draggedURL = [NSURL URLWithString:draggedURLString]; 

      NSString *draggedPath = [draggedURL path]; 

      NSLog(@"pathname: %@", draggedPath); 

      // do something with the path 

      // get file attributes 

      NSDictionary *draggedAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:draggedPath error:nil]; 

      if (draggedAttributes == nil) 
       continue; 

      // the NSFileWrapper allows access to the absolute file via NSFileSystemFileNumber 
      // put the path and the inode (returned as an NSNumber) into a NSMutableDictionary 

      NSNumber *draggedInode = [draggedAttributes objectForKey:NSFileSystemFileNumber]; 

      [draggedFiles setObject:draggedPath forKey:draggedInode]; 
     } 

    } 

    return [super draggingEntered:sender]; 
} 

एक मुद्दा यह है कि एक से अधिक फ़ाइलों को देखने में घसीटा (या तो अकेले या एक साथ) जो एक ही फाइल करने के लिए हार्ड लिंक कर रहे हैं, केवल के रूप में सूचीबद्ध हो जाएगा अंतिम पथनाम शब्दकोश में जोड़ा गया जो इनोड साझा करता है। आपके आवेदन द्वारा पथनामों का उपयोग कैसे किया जाता है इस पर निर्भर करता है कि यह एक मुद्दा हो सकता है।

+0

कूल, लेकिन बमर। इसकी जांच में, मुझे लगता है कि ड्रैगिंग किया गया था जहां मैं नेतृत्व कर रहा था लेकिन अभी तक कोड नहीं डाला था। मैं अगले कुछ दिनों में आपका उदाहरण आज़माउंगा और आपको बता दूंगा। धन्यवाद! –

+0

यह जाने का एकमात्र तरीका प्रतीत होता है। कोड उदाहरणों के लिए धन्यवाद - यह मुझे प्राप्त कर रहा है जहां मुझे जाना है। इस जवाब को स्वीकार किया। –