NSAttributedString '\n' игнорируется

У меня есть одно представление, единственным элементом пользовательского интерфейса которого является UITextView. В viewDidLoad: я создаю атрибутивную строку с "Text\n" и устанавливаю атрибутированный текст текстового представления как таковой:

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

Моя проблема в том, что разрыв строки игнорируется при запуске приложения.

Если я использую NSString и setText:, этого не происходит.

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

Кто-нибудь может пролить свет на происходящее? Кажется, я не могу найти что-либо в документации или иным образом.


person winsome    schedule 24.03.2013    source источник


Ответы (2)


Вы можете использовать это:

 NSMutableAttributedString *cr = [[NSMutableAttributedString alloc] initWithString: @"\n"];

Итак, если у вас есть две NSMutableAttributedString (string1 и string2), вы можете сделать:

[string1 appendAttributedString: cr];
[string1 appendAttributedString: string2];

Это ужасно и не элегантно.... но это работает!!!

person Blasco73    schedule 01.07.2014
comment
NSAttributedString не может использовать appendAttributedString, потому что его нельзя изменить. Правильно ли использовать NSMutableAttributedString? - person Penguin; 26.12.2015

Я бы посоветовал вам использовать:

[[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 немного по-другому, чтобы добиться такого же внешнего вида. Я не буду беспокоить вас подробностями.

person Jean    schedule 24.03.2013
comment
Метод initWithHTML: недоступен в iOS. - person rmaddy; 24.03.2013
comment
На данный момент меня больше беспокоит понимание того, почему я не получаю ожидаемого поведения, но я буду помнить об этом, если мне придется обойти это. - person winsome; 24.03.2013
comment
@winsome Затем вы можете проверить на стороне: конфигурацию абзаца вашей строки с атрибутами или конфигурацию вашего UITextView. Проверьте страницу 29 и далее этого документа developer.apple .com/library/mac/documentation/cocoa/conceptual/ - person Jean; 24.03.2013
comment
Великолепно! Это должен быть выбранный ответ. - person David H; 11.02.2016