создать атрибутивную строку из простого текста (в формате Android) в swift для iOS

Я читаю строки из Localizable.strings, который содержит что-то подобное, что в основном то, что у вас есть в strings.xml приложения для Android

"testShort" = "A <b>short</b>\ntest with another<b>bold text</b>";

Жирный шрифт и и перевод строки - единственные два атрибута форматирования, которые у меня есть в моих текстах. Я пытаюсь разработать такой метод в течение нескольких дней безуспешно:

func ConvertText(inputText: String) -> NSAttributedString {
    // here comes the conversion to a representation with Helvetica 14pt and Helvetica-Bold 14pt including line feeds.
}

Моя конечная цель - отобразить текст в attitText UITextView.

Будучи новичком в Swift и iOS, не зная Objective-C, я обнаружил, что очень трудно выполнять манипуляции со строками, поскольку они довольно разные и сложные, и все примеры приведены в Objective-C. Что делает это еще сложнее, так это то, что большинство методов API недоступны или отличаются в Swift, чем в Objective-C ...

Вот что я пробовал до сих пор для тела метода с помощью множества других постов здесь:

var test = inputText.dataUsingEncoding(NSUnicodeStringEncoding, allowLossyConversion: true)!
attrStr = NSAttributedString(
        data: test,
        options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
        documentAttributes: nil,
        error: nil)!
return attrStr

Основные проблемы здесь заключаются в том, что\n не конвертируется и шрифт очень маленький и другой.

Затем я попытался вручную выделить часть текста. Кажется, работает так:

var newText = NSMutableAttributedString(string: inputText)
newText.addAttribute(NSFontAttributeName, value: UIFont(name: "Helvetica-Bold", size: 14.0)!, range: NSRange(location:2,length:4))

Теперь я попытался найти атрибуты в тексте, удалив их и использовав addAttribute вроде как

// Start of bold text
var range = newText.rangeOfString("<b>")!
// End of bold text
var range2 = newText.rangeOfString("</b>")!

// replacing attributes
newText = newText.stringByReplacingCharactersInRange(range, withString: "")
newText = newText.stringByReplacingCharactersInRange(range2, withString: "")

// creating a range for bold => error "'String.Index' is not convertible to 'int'"
// how to do such a thing
var boldRange = NSMakeRange(range.startIndex, range2.endIndex -3)

// setting bold
newText.addAttribute(NSFontAttributeName, value: UIFont(name: "Helvetica-Bold", size: 14.0)!, range: boldRange)

Вся эта проблема с диапазоном - моя главная проблема на данный момент, поскольку она сильно отличается от простой позиции в последовательности.

Эта проблема является отличным примером отсутствия (или хорошо скрытой) документации:

addAttribute хочет NSRange, тоrangeOfString Похоже, что предоставляет общий диапазон в соответствии с полученным сообщением об ошибке, но информации об этом нет. Кнопка поиска документации в Xcode наrangeOfString() приводит к NSString. Поиск там дляrangeOfString()говорит, что возвращаетсяNSRange, Нажатие на это приводит к информации о псевдониме типа для_NSRange который в свою очередь имеет два свойства NSUInteger с именемlocation а такжеlength, Где находятся свойства startIndex и endIndex, которые я вижу в XCode? Очень запутанно ...

Было бы здорово, если бы вы могли дать мне несколько фрагментов или подсказок, где я ошибаюсь, или даже тело метода, поскольку я все еще надеюсь, что это не слишком сложно, если вы хорошо знаете iOS и Swift. Я стремлюсь к поддержке iOS 7.1, но если это проще с iOS 8, то это тоже хорошо.

Ответы на вопрос(1)

Ваш ответ на вопрос