NSMutableAttributedString Добавить в UITextView

Мне нужно добавить 2 NSMutableAttributedString для моего UITextview, когда пользователь выбирает разные слова, как в примере.

string = @ "blabla1 blabla2 blabla3"

в первый раз пользователь выбирает @ "blabla1"

и текст выглядит так @ "blabla1 blabla2 blabla3"

и после того, как я выберу @ "blabla3", результат, который я хочу получить в Моем UITextview, будет @ "blabla1 blabla2 blabla3"

теперь результат, который я получаю, это @ "blabla1 blabla2 blabla3 blabla1 blabla2 blabla3"

что мой код:

-(NSMutableAttributedString*)getNSMutableAttributedString:(NSString*)string withRange:(NSRange)range withTextView:(UITextView*)textView
{
if (!str)
{
    str = [[NSMutableAttributedString alloc] initWithString:string];
    UIFont *font = [UIFont boldSystemFontOfSize:16];
    [str addAttribute:NSFontAttributeName value:font range:NSMakeRange(range.location, range.length)];

}
else
{
    NSMutableAttributedString *mutableAttString = [[NSMutableAttributedString alloc] initWithString:string];

    UIFont *font = [UIFont boldSystemFontOfSize:16];
    [mutableAttString addAttribute:NSFontAttributeName value:font range:NSMakeRange(range.location, range.length)];

    NSMutableAttributedString *first = str;
    NSMutableAttributedString *second = mutableAttString;

    NSMutableAttributedString* result = [first mutableCopy];
    [result appendAttributedString:second];

    str = result;

}

return str;
}

2 ответа

Решение

Атрибуты могут быть добавлены несколько раз к одной строке. И вы создаете новую строку attribuString из строки, которая не имеет атрибутов. В результате вы получите @ "blabla1 blabla2 blabla3 blabla1 blabla2 blabla3"

-(NSMutableAttributedString*)getNSMutableAttributedString:(NSMutableAttributedString*)string withRange:(NSRange)range withTextView:(UITextView*)textView
{
if (!str)
 {
    str = [[NSMutableAttributedString alloc] initWithAttributedString:string];
    UIFont *font = [UIFont boldSystemFontOfSize:16];
    [str addAttribute:NSFontAttributeName value:font range:NSMakeRange(range.location, range.length)];
 }
else
  {
    UIFont *font = [UIFont boldSystemFontOfSize:16];
    [str addAttribute:NSFontAttributeName value:font range:NSMakeRange(range.location, range.length)];
  }
return str;
}

Что вы должны сделать, это получить str (существующий attributedText от UITextView), а затем добавить атрибут в определенный диапазон

str = [textView attributedText];
UIFont *font = [UIFont boldSystemFontOfSize:16];
[str addAttribute:NSFontAttributeName value:font range:NSMakeRange(range.location, range.length)];

return str;

Что вы делаете, это создаете новую атрибутивную строку с тем же содержимым, но с другими атрибутами, а затем добавляете к существующему атрибуту. Вот почему вы видите текст, повторенный дважды.

Другие вопросы по тегам