stringByReplacingOccourencesOfString с NSMutableAttributedString

Я получаю из XML-файла следующий текст:

"Weekly menus from December 21<sup>st</sup> till 28<sup>th</sup>" и хотите, чтобы они отображались как: "Еженедельное меню с 21го декабря по 28е"

-Теги связаны с тем, что XML-файл используется для html и iOS. Теперь я хочу «сдвинуть» st/nd/rd/th в дате и сделал следующий код:

NSString *basicString = dieMenueDaten.SubtitelE;

NSDictionary *attribute = @{(NSString*)kCTSuperscriptAttributeName: @1 };
NSMutableAttributedString *subStringTh = [[NSMutableAttributedString alloc] initWithString:@"th" attributes:attribute];
NSMutableAttributedString *newSubtitleE = [[NSMutableAttributedString alloc] initWithString:basicString];
NSMutableAttributedString *replaceTh = [[NSMutableAttributedString alloc] initWithString:@"<sup>th</sup>"];

NSRange laenge = NSMakeRange(0, basicString.length);

newSubtitleE = [[newSubtitleE mutableString] stringByReplacingOccurrencesOfString:replaceTh withString:subStringTh options:NSCaseInsensitiveSearch range:laenge];

Делая это, я получаю

несовместимый тип указателей, отправляющий «NSMutableAttributedString *» в параметр типа «NSString *_Nonnull»

и

присвоение типа несовместимых указателей «NSMutableAttributedString *» из «NSString *»

Что я должен сделать, чтобы избежать сообщений об ошибках?


person Christian    schedule 22.12.2015    source источник
comment
Возможный дубликат NSMutableString stringByReplacingOccurrencesOfString Warning   -  person Teja Nandamuri    schedule 22.12.2015
comment
похоже на этот дубликат, но вы пытаетесь смешивать изменяемые и неизменяемые атрибуты и простые строки, а не только изменяемые и неизменяемые простые строки...   -  person Wain    schedule 22.12.2015
comment
Найти все диапазоны и использовать вместо них replaceCharactersInRange: withAttributedString:?   -  person Larme    schedule 22.12.2015


Ответы (3)


Из Справочник по классу NSString

- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target
                                    withString:(NSString *)replacement
                                       options:(NSStringCompareOptions)options
                                         range:(NSRange)searchRange

Этот метод принимает 2 параметра NSString для цели и замены, а не два параметра NSMutableAttributedString.

Вы можете дополнительно попробовать replaceTh.string и subStringTh.string, чтобы получить свойство NSString каждого предоставленного вами NSMutableAttributedString.

Ваше второе предупреждение связано с тем, что приведенный выше метод возвращает NSString, а не NSMutableAttributedString, который вы объявили newSubtitleE как таковой.

person Frankie    schedule 22.12.2015
comment
Спасибо. Здесь я нашел подсказку, где строкаByReplacing... с параметрами и диапазоном использовалась с атрибутамиStrings. Я искал другое решение. - person Christian; 22.12.2015
comment
Может быть, вы искали метод replaceCharactersInRange:withAttributedString, который можно найти в справочнике NSMutableArributedString? Используйте документы, и вам не придется гадать, какие методы доступны. - person Frankie; 23.12.2015

Хорошо, из-за быстрых подсказок я изменил его следующим образом (с хорошим описанием здесь):

- (NSMutableAttributedString *)attributedSubTitleString:(NSString *)string;
{
NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:string];
UIFont *smallFont = [UIFont boldSystemFontOfSize:9.0f];

[attString beginEditing];
[attString addAttribute:NSFontAttributeName value:(smallFont) range:[string rangeOfString:@"th"]];
[attString addAttribute:NSFontAttributeName value:(smallFont) range:[string rangeOfString:@"th" options:NSBackwardsSearch]];
[attString addAttribute:(NSString*)kCTSuperscriptAttributeName value:@"1" range:[string rangeOfString:@"th"]];
[attString addAttribute:(NSString*)kCTSuperscriptAttributeName value:@"1" range:[string rangeOfString:@"th" options:NSBackwardsSearch]];

[attString addAttribute:NSFontAttributeName value:(smallFont) range:[string rangeOfString:@"st"]];
[attString addAttribute:NSFontAttributeName value:(smallFont) range:[string rangeOfString:@"st" options:NSBackwardsSearch]];
[attString addAttribute:(NSString*)kCTSuperscriptAttributeName value:@"1" range:[string rangeOfString:@"st"]];
[attString addAttribute:(NSString*)kCTSuperscriptAttributeName value:@"1" range:[string rangeOfString:@"st" options:NSBackwardsSearch]];

[attString addAttribute:NSFontAttributeName value:(smallFont) range:[string rangeOfString:@"nd"]];
[attString addAttribute:NSFontAttributeName value:(smallFont) range:[string rangeOfString:@"nd" options:NSBackwardsSearch]];
[attString addAttribute:(NSString*)kCTSuperscriptAttributeName value:@"1" range:[string rangeOfString:@"nd"]];
[attString addAttribute:(NSString*)kCTSuperscriptAttributeName value:@"1" range:[string rangeOfString:@"nd" options:NSBackwardsSearch]];

[attString addAttribute:NSFontAttributeName value:(smallFont) range:[string rangeOfString:@"rd"]];
[attString addAttribute:NSFontAttributeName value:(smallFont) range:[string rangeOfString:@"rd" options:NSBackwardsSearch]];
[attString addAttribute:(NSString*)kCTSuperscriptAttributeName value:@"1" range:[string rangeOfString:@"rd"]];
[attString addAttribute:(NSString*)kCTSuperscriptAttributeName value:@"1" range:[string rangeOfString:@"rd" options:NSBackwardsSearch]];

[attString endEditing];
return attString;
}

и в ячейкеForRowAtIndexPath:

NSString *basicString = dieMenueDaten.SubtitelE;

basicString = [basicString stringByReplacingOccurrencesOfString:@"<sup>" withString:@""];
basicString = [basicString stringByReplacingOccurrencesOfString:@"</sup>" withString:@""];

NSMutableAttributedString *newSubtitleE = [[NSMutableAttributedString alloc] initWithString:basicString];

newSubtitleE = [self attributedSubTitleString:basicString];
....
        cell.MenueTitel.text = dieMenueDaten.TitelE;
        cell.MenueSubtitel.attributedText = newSubtitleE;

Работает идеально для меня.

person Christian    schedule 22.12.2015

Проверьте этот репозиторий: DecodeHTML.swift.

person Florentin    schedule 22.12.2015