NSmutablestring с 2 разрывами строки завершает работу программы - PullRequest
0 голосов
/ 21 сентября 2018

Мне нужно создать строку Nsmutableattributed, которая начинается с разрыва строки, код выглядит следующим образом:

let dateString = TimeUtils.formatTimeOnly(from: data.date!)
let dateMutableString = NSMutableAttributedString.init(string: "\n\(dateString)")
let range = NSRange(location: 0, length: (dateString.count + 2))
dateMutableString.addAttributes([NSFontAttributeName: UIFont(name: "SourceSansPro-Regular", size: 11)!, NSForegroundColorAttributeName: UIColor.gray], range: range)

если я только начну строку только с одним \ n, это приведет к сбою программы на атрибутах addatстрока, но если я использую \ n \ n, то это не сломает программу.Могу я узнать, что на самом деле здесь происходит?

1 Ответ

0 голосов
/ 21 сентября 2018

Если есть только один дополнительный символ, тогда dateString.count + 2 длиннее строки, и вы получаете сбой, потому что диапазон недопустим.

Почему длина диапазона основана на dateString.count + 2?Почему бы не собрать нужную строку, а затем передать ее инициализатору NSMutableAttributedString?Тогда вы можете напрямую получить длину этой строки.И почему бы не передать нужные атрибуты инициализатору, поскольку вы все равно хотите, чтобы они применялись ко всей строке?

Кроме того, вы не можете использовать count в строке Swift, чтобы получить длину при работе с NSString или NSAttributedString.Вам необходимо использовать dateString.utf16.count.Это связано с тем, что NSRange для NSString и NSAttributedString основаны на 16-разрядных символах.

Вот более простой способ создания атрибутной строки, в которой атрибуты применяются ко всей строке:

let dateString = TimeUtils.formatTimeOnly(from: data.date!)
let dateAttributes = [NSFontAttributeName: UIFont(name: "SourceSansPro-Regular", size: 11)!, NSForegroundColorAttributeName: UIColor.gray]
let dateMutableString = NSMutableAttributedString(string: "\n\(dateString)", attributes: dateAttributes)
...