NSAttributedString '\n' 被忽略了。

17

我有一个仅有一个 UITextView UI元素的单一视图。在 viewDidLoad: 中,我创建了一个带有 "Text\n" 的属性字符串,并将文本视图的属性文本设置为此字符串:

NSAttributedString *string = [[NSAttributedString alloc] initWithString:@"Text\n"];  
[self.textView setAttributedText:string];

我的问题是当我运行这个应用时,换行符被忽略了。

如果我使用NSStringsetText:方法就不会发生这种情况。

NSString *string = [[NSString alloc] initWithString:@"Text\n"];  
[self.textView setText:string];

有人能解释一下正在发生什么吗?我在文档或其他地方似乎找不到任何信息。

2个回答

7
你可以使用以下方法:
 NSMutableAttributedString *cr = [[NSMutableAttributedString alloc] initWithString: @"\n"];

如果你有两个NSMutableAttributedString(string1和string2),你可以这样做:
[string1 appendAttributedString: cr];
[string1 appendAttributedString: string2];

这不是很好看,也不太优雅...但是它能用!!!


NSAttributedString 无法使用 appendAttributedString,因为它无法修改。是否应该使用 NSMutableAttributedString - Penguin

3

我建议您使用:

[[NSAttributedString alloc] initWithHTML:[@"Text<BR />" dataUsingEncoding:NSUTF8StringEncoding] documentAttributes:NULL];

我经常使用这个功能,它非常完美。我甚至把它转化成了一个宏:
#define html2AttributedString(htmlString)                                                                   \
    [[[NSAttributedString alloc] initWithHTML:[(htmlString) dataUsingEncoding:NSUTF8StringEncoding]         \
    documentAttributes:NULL] autorelease]

然后,您可以为颜色、对齐方式、字体等制作宏。

简而言之,您只需要将字符串中的所有"\n"替换为<BR />并使用上面提供的代码。对于替换部分,请使用以下代码:

[yourString stringByReplacingOccurrencesOfString:... withString:…];

针对iOS,你可以查看这个页面,他们会提供一个替代品。
我们的initWithHTML方法旨在完美匹配Mac版本的输出。这对于字符来说是可能实现的,并且我制定了单元测试,以确保它始终完美。关于属性,有许多需要在iOS上略微不同地处理才能实现相同的外观。我不会在这里详细介绍这些细节。

2
在iOS中,'initWithHTML:'方法不可用。 - rmaddy
目前我更关心的是理解为什么我没有得到预期的行为,但如果最终不得不绕过它,我会记住这一点。 - winsome
@winsome 然后,您可以检查您的属性字符串的段落配置或UITextView的配置。请参阅此文档的第29页及其后面内容:http://developer.apple.com/library/mac/documentation/cocoa/conceptual/strings/strings.pdf - Jean
太棒了!这应该是被选中的答案。 - David H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接