2

Kullanıcıların stilleri metin ekleyebileceği ve resim ekleyebildiği bir Metin Düzenleyici yazıyorum, bu yüzden içeriği yönetmek için NSAttributedString kullanıyorum. Sorum şu: Metin Editörü kapatılmadan önce içeriği nasıl saklayabilirim ve editörün bir dahaki sefere açıldıktan sonra içeriğini nasıl geri yükleyebilirim?NSTextAttachment içeren NSAttributedString, saklanabilir (veya geri yüklenebilir)?

-(NSData*)customEncode { 
__block NSMutableArray* archivableAttributes=[[NSMutableArray alloc]init]; 

[self enumerateAttributesInRange:NSMakeRange(0, [self length]) options:0 usingBlock:^(NSDictionary *attrs, NSRange range, BOOL *stop) { 
    NSLog(@"range: %d %d",range.location, range.length); 
    NSLog(@"dict: %@",attrs); 
    NSLog(@"keys: %@", [attrs allKeys]); 
    NSLog(@"values: %@", [attrs allValues]); 

    NSMutableDictionary* tDict=[[NSMutableDictionary alloc]init]; 

    [tDict setObject:[NSNumber numberWithInt:range.location] forKey:@"location"]; 
    [tDict setObject:[NSNumber numberWithInt:range.length] forKey:@"length"]; 

    for (NSString* tKey in [attrs allKeys]) { 
     if ([tKey isEqualToString:@"CTUnderlineColor"]) { 
      [tDict setObject:[NSAttributedString arrayFromCGColorComponents:((CGColorRef)[attrs objectForKey:@"CTUnderlineColor"])] forKey:@"CTUnderlineColor"]; 
     } 
     if ([tKey isEqualToString:@"NSUnderline"]) { 
      NSNumber* underline=[attrs objectForKey:@"NSUnderline"]; 
      [tDict setObject:underline forKey:@"NSUnderline"]; 
     } 
     if ([tKey isEqualToString:@"CTForegroundColor"]) { 
      [tDict setObject:[NSAttributedString arrayFromCGColorComponents:((CGColorRef)[attrs objectForKey:@"CTForegroundColor"])] forKey:@"CTForegroundColor"]; 
     } 
     if ([tKey isEqualToString:@"NSFont"]) { 
      CTFontRef font=((__bridge CTFontRef)[attrs objectForKey:@"NSFont"]); 

      NSDictionary* fontDict=[NSDictionary 
            dictionaryWithObjects: 
            [NSArray arrayWithObjects:(NSString*)CFBridgingRelease(CTFontCopyPostScriptName(font)),[NSNumber numberWithFloat:CTFontGetSize(font)], nil] 
            forKeys: 
            [NSArray arrayWithObjects:@"fontName", @"fontSize", nil]]; 

      [tDict setObject:fontDict forKey:@"NSFont"]; 
     } 
    } 

    [archivableAttributes addObject:tDict]; 
}]; 

NSMutableDictionary* archiveNSMString=[NSMutableDictionary 
             dictionaryWithObjects: [NSArray arrayWithObjects:[self string],archivableAttributes,nil] 
             forKeys:[NSArray arrayWithObjects:@"string",@"attributes",nil]]; 

NSLog(@"archivableAttributes array: %@",archiveNSMString); 

NSData* tData=[NSKeyedArchiver archivedDataWithRootObject:archiveNSMString]; 

NSLog(@"tdata: %@",tData); 

return tData; 

} Oldukça geçirmişti

:

Ben, aşağıda benim kod parçasıdır şimdi ben NSTextAttachment içinde UIImageView'ın depolamak (ve geri yükleme) metin ama edemez, NSAttributedString kategorisini yazdı Araştırmak ve denemek için bir süre ve aramalar aynı soruyu yaşayan birkaç kişiyi gösterdi, ancak tatmin edici bir cevap yoktu.

cevap

1

Sonunda, NSAttributedString'i doğrudan serileştirmek için YYTextArchiver adlı NSKeyedArchiver alt sınıfını kullandım ve benim için çalıştı.

0

NSRTFDTextDocumentType numaralı belge türüyle fileWrapperFromRange:documentAttributes:error: kullanın.

+0

Ben NSFileWrapper aşina değilim daha fazla ayrıntı veya herhangi bir bağlantı sağlayabilir? teşekkür ederim. –

0
//Swift-3 
You can store NSTextAttachment images by :- 

var imageArray : [UIImage] 


//MARKS:- Extract attachedImage 
    func textViewDidChange(_ textView: UITextView) { 
     imageArray = [UIImage]() 
     let range = NSRange(location: 0, length: textView.attributedText.length) 
     if (textView.textStorage.containsAttachments(in: range)) { 
      let attrString = textView.attributedText 
      var location = 0 
      while location < range.length { 
       var r = NSRange() 
       let attrDictionary = attrString?.attributes(at: location, effectiveRange: &r) 
       if attrDictionary != nil { 
        let attachment = attrDictionary![NSAttachmentAttributeName] as? NSTextAttachment 
        if attachment != nil { 
         if attachment!.image != nil { 
          //store the image Attached to it. 
          imageArray.append(attachment!.image!) 
         } 
        } 
        location += r.length 
       } 
      } 
     } 
    } 

} 

Concat her şeyden görüntü kendisine Ekli: -

let axtractedImageAttribute = NSMutableAttributedString() 
     for image in imageArray { 
      let attachment:NSTextAttachment = NSTextAttachment() 
      attachment.image = image 
      attachment.setImageHeight(height: 20) 
      let attachmentString:NSAttributedString = NSAttributedString(attachment: attachment) 
      axtractedImageAttribute.append(attachmentString) 
     } 

Demo

İlgili konular