3

我有一个NSAttributedString可以包含 3 个不同的东西:

  • 只是一个图像。(一个附件)
  • 只是文字
  • 图像后跟文本(/!\ 不是相反,永远不会)。

我正在尝试“扫描”该对象以了解我是否有图像或文本,如果有图像,之后是否有文本。

我不习惯使用枚举和范围参数;文档并没有真正帮助我理解如何完成这项工作。

您将如何实现这一目标?

  • 如果有,则提取图像
  • 如果有一个字符串(单独或在图像之后),则提取字符串。

我现在拥有的唯一代码来自另一篇 SO 帖子,如果只有一张图片,它会很有帮助。

 NSAttributedString *currentString = self.inputToolbar.contentView.textView.attributedText;
 __block UIImage *currentImage = nil;    
    [currentString enumerateAttribute:NSAttachmentAttributeName
                                 inRange:NSMakeRange(0, [currentString 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)
                                          currentImage = image;
                                  }
                              }];
4

1 回答 1

0

这个想法是保持相同的逻辑,但使用 aNSMutableAttributedString而不是 a NSAttributedString,保留NSRange图像的 the 并删除它。

NSMutableAttributedString *currentString = [[NSMutableAttributedString alloc] initWithAttributedString:self.inputToolbar.contentView.textView.attributedText];
__block UIImage *currentImage = nil;    
__block NSRange imageRange;
[currentString enumerateAttribute:NSAttachmentAttributeName
                                 inRange:NSMakeRange(0, [currentString 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)
                                      {
                                          currentImage = image;
                                          imageRange = range;
                                      }
                                  }
                              }];

NSString *text = @"";
if (image)
{
    text = [[currentString deleteCharactersInRange:imageRange] string];
}

if ([text length] > 0)
{
    NSLog(@"Found Text: %@", text);
}
else
{
    NSLog(@"Did Found Text");
}


NSLog(image?@"Found Image";@"Did NOT found image");
于 2015-06-18T12:48:24.940 回答