Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why appendAttributedString show appended string in a new line?

For example, I have 3 sentences such as @"Long long ago.",@"There is a child.",@"bla bla bla" And I made a method below

- (void)appendText:(NSString*)text
{
    NSMutableAttributedString *originalText = [[NSMutableAttributedString alloc] initWithAttributedString:_textView.attributedText];
    NSAttributedString *appendText = [[NSAttributedString alloc] initWithString:text
                                                                     attributes:@{NSForegroundColorAttributeName:DefaultTextColor}];

    [originalText appendAttributedString:appendText];
    _textView.attributedText = originalText;
}

So I invoked appendText 3 times

[self appendText:@"Long long ago."];
[self appendText:@"There is a child."];
[self appendText:@"bla bla bla."];

The result I expected is

Long long ago.There is a child.bla bla bla.

But the output is

Long long ago.
There is a child.
bla bla bla

Why appendAttributedString show appended string in a new line? How can I put the appended text in one paragraph?

Thanks for any help.

like image 223
echo Avatar asked Nov 18 '12 15:11

echo


1 Answers

From my own experiences, when you set the attributedText property of UITextView, the text is getting a newline added to it. So when you later retrieve the attributedText from the UITextView, this newline is at the end of the text. So when you append more text, the newline is in the middle (and another one is added to the end).

I don't know if this is a bug in UITextView or possibly NSAttributedString.

One workaround would be to update your code as follows:

- (void)appendText:(NSString*)text {
    NSMutableAttributedString *originalText = [[NSMutableAttributedString alloc] initWithAttributedString:_textView.attributedText];
    // Remove any trailing newline
    if (originalText.length) {
        NSAttributedString *last = [originalText attributedSubstringFromRange:NSMakeRange(originalText.length - 1, 1)];
        if ([[last string] isEqualToString:@"\n"]) {
            originalText = [originalText attributedSubstringFromRange:NSMakeRange(0, originalText.length - 1)];
        }
    }

    NSAttributedString *appendText = [[NSAttributedString alloc] initWithString:text attributes:@{NSForegroundColorAttributeName:DefaultTextColor}];

    [originalText appendAttributedString:appendText];
    _textView.attributedText = originalText;
}
like image 120
rmaddy Avatar answered Nov 06 '22 07:11

rmaddy