2015-06-18 2 views
3

У меня есть NSAttributedString, который может содержать 3 разные вещи:Split NSAttributedString в Image + NSString

  • Просто изображение. (приложение)
  • Только текст
  • Изображение, за которым следует текст (/! \, а не наоборот, никогда).

Я пытаюсь «отсканировать» этот объект, чтобы узнать, есть ли у меня изображение или текст, и есть ли изображение, если после этого есть текст.

Мне неудобно использовать параметры перечисления и диапазона; документация не помогла мне понять, как это сделать.

Как бы вы это достигли?

  • Извлечение изображения, если есть один
  • Извлечение строки, если есть один (либо отдельно, либо после того, как изображения).

Единственный код, который у меня есть сейчас, это другое сообщение 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; 
            } 
           }]; 
+0

Убедитесь, что '[currentString string]' не возвращает вам только текст, даже если есть изображение. Если это так, у вас будет текст, и у вас уже есть код для получения изображения (кажется, это мой код кстати). – Larme

+0

Это не делает трюк, очевидно :( –

+0

Сохраните диапазон найденного изображения и используйте вместо него 'NSMutableAttributedString', и вы можете использовать' deleteCharactersInRange: 'для удаления изображения в этом диапазоне. – Larme

ответ

0

Идея заключается в том, чтобы сохранить ту же логику, но с использованием NSMutableAttributedString вместо NSAttributedString, держать NSRange изображения, и удалите его.

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([email protected]"Found Image";@"Did NOT found image"); 
+0

Эй, я пробовал это, когда вы впервые прокомментировали его, но по какой-то причине возвращаемый объект NSRange в блоке имеет значение null :(Что может быть причиной этого? (я его запустил) прямо после первой фигурной скобки и ее нулевой) –

+0

Я удалил проблему с указателем из моего кода. Все еще не работает? – Larme

+0

Я регистрирую объект «range», а не объект imageRange. Я в основном ничего не назначаю для своего __блока varialbe Так что нет, это не помогло: P –

Смежные вопросы