You need to list NSAttributedString to search for NSTextAttachment s.
NSMutableArray *imagesArray = [[NSMutableArray alloc] init]; [attributedString enumerateAttribute:NSAttachmentAttributeName inRange:NSMakeRange(0, [attributedString length]) options:0 usingBlock:^(id value, NSRange range, BOOL *stop) { if ([value isKindOfClass:[NSTextAttachment class]]) { NSTextAttachment *attachment = (NSTextAttachment *)value; UIImage *image = nil; if ([attachment image]) image = [attachment image]; else image = [attachment imageForBounds:[attachment bounds] textContainer:nil characterIndex:range.location]; if (image) [imagesArray addObject:image]; } }];
As you can see, there is an if ([attachment image]) test. This is because if you created an NSTextAttachment for installation with NSAttachmentAttributeName , it will exist and your image will be there. But if you use, for example, an image from the Internet and convert it as an NSTextAttachment from HTML code, then the [attachment image] will be zero and you will not be able to get the image.
You can see it using breakpoints with this snippet (with setting the real image URL and the real image name from the package. NSString * htmlString = @ "http: // anImageURL \"> Blahttp: // anOtherImageURL \ "> Test retest ";
NSError *error; NSAttributedString *attributedStringFromHTML = [[NSAttributedString alloc] initWithData:[htmlString dataUsingEncoding:NSUTF8StringEncoding] options:@{NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute:@(NSUTF8StringEncoding)} documentAttributes:nil error:&error]; NSTextAttachment *textAttachment = [[NSTextAttachment alloc] init]; [textAttachment setImage:[UIImage imageNamed:@"anImageNameFromYourBundle"]]; NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithAttributedString:attributedStringFromHTML]; [attributedString appendAttributedString:[NSAttributedString attributedStringWithAttachment:textAttachment]];
Larme
source share