2014-04-20 12 views
7

Mam NSTextView. Wklejam obraz i widzę go. Kiedy otrzymam NSTextAttachment dla NSAttributedString widoku tekstowego, jego plik jest zerowy. Jak uzyskać dane obrazu wklejone w widoku tekstowym?Jak uzyskać dane obrazu z NSAttributedString

Używam kategorii na NSAttributedString, aby uzyskać załączniki tekstowe. Wolałbym nie pisać na dysk, jeśli to możliwe.

- (NSArray *)allAttachments 
{ 
    NSError *error = NULL; 
    NSMutableArray *theAttachments = [NSMutableArray array]; 
    NSRange theStringRange = NSMakeRange(0, [self length]); 
    if (theStringRange.length > 0) 
    { 
     NSUInteger N = 0; 
     do 
     { 
      NSRange theEffectiveRange; 
      NSDictionary *theAttributes = [self attributesAtIndex:N longestEffectiveRange:&theEffectiveRange inRange:theStringRange]; 
      NSTextAttachment *theAttachment = [theAttributes objectForKey:NSAttachmentAttributeName]; 
      if (theAttachment != NULL){ 
       NSLog(@"filewrapper: %@", theAttachment.fileWrapper); 
       [theAttachments addObject:theAttachment]; 
      } 
      N = theEffectiveRange.location + theEffectiveRange.length; 
     } 
     while (N < theStringRange.length); 
    } 
    return(theAttachments); 
} 
+0

można dodać kod pokazujący, co robisz, jak się próbuje uzyskać dostęp do danych obrazu itd dokładnie Bez takich informacji ludzie, którzy próbują ci pomóc, po prostu zgadują. – CRD

Odpowiedz

7
  1. Wyliczanie załączniki. [NSTextStorage enumerateAttribute: ...]
  2. Zdobądź plik filtrowy załącznika.
  3. Napisz na adres URL.

    [textStorage enumerateAttribute:NSAttachmentAttributeName 
             inRange:NSMakeRange(0, textStorage.length) 
             options:0 
            usingBlock:^(id value, NSRange range, BOOL *stop) 
    { 
        NSTextAttachment* attachment = (NSTextAttachment*)value; 
        NSFileWrapper* attachmentWrapper = attachment.fileWrapper; 
        [attachmentWrapper writeToURL:outputURL options:NSFileWrapperWritingAtomic originalContentsURL:nil error:nil]; 
        (*stop) = YES; // stop so we only write the first attachment 
    }]; 
    

Ten przykładowy kod napisze tylko pierwszy przywiązanie do outputURL.

+0

Teraz ustawiane jest moje opakowanie pliku. Zaakceptowałem tę odpowiedź, ponieważ działa, jeśli nie ma problemu z zapisaniem na dysk. – joels

2

Możesz pobrać zawarte NSImage z komórki załącznika.

Minimalistyczne przykład:

// assuming we have a NSTextStorage* textStorage object ready to go, 
// and that we know it contains an attachment at some_index 
// (in real code we would probably enumerate attachments). 

NSRange range; 
NSDictionary* textStorageAttrDict = [textStorage attributesAtIndex:some_index 
              longestEffectiveRange:&range 
                  inRange:NSMakeRange(0,textStorage.length)]; 

NSTextAttachment* textAttachment = [textStorageAttributesDictionary objectForKey:@"NSAttachment"]; 
NSTextAttachmentCell* textAttachmentCell = textAttachment.attachmentCell; 
NSImage* attachmentImage = textAttachmentCell.image; 

montaż: tylko OS X (wersja zestawu klas AppKit)

+0

Właściwość 'attachmentCell' wydaje się nie istnieć w klasie' NSTextAttachment', chyba że czegoś mi brakuje. –

+0

@Craig Otis Wydaje się, że istnieje tylko dla wersji OS X, nie dla wersji iOS (UIKit). –

Powiązane problemy