Атрибутированный текст с TextView вызывает сбой

У меня есть следующий быстрый код для создания строки с атрибутами,

func getAttributedTermsAndServicesText() -> NSAttributedString {
    let text = StringConstants.RegisterConstants.termsOfUseLabelText
    let attributedString = NSMutableAttributedString(string: text)
    let termsRange = attributedString.mutableString.range(of: StringConstants.CommonConstants.termsOfUse)
    attributedString.addAttribute(NSAttributedStringKey.font, value: WebViewLinkType.termsOfUse.getLink(), range: termsRange)
    attributedString.addAttribute(NSAttributedStringKey.font, value: NSUnderlineStyle.styleSingle.rawValue, range: termsRange)

    let privacyRange = attributedString.mutableString.range(of: StringConstants.CommonConstants.privacyStatement)
    attributedString.addAttribute(NSAttributedStringKey.link, value: WebViewLinkType.privacyStatement.getLink(), range: privacyRange)
    attributedString.addAttribute(NSAttributedStringKey.underlineStyle, value: NSUnderlineStyle.styleSingle.rawValue, range: privacyRange)

    print(attributedString.mutableString)
    return attributedString
  }

Этот метод возвращает сгенерированную строку с атрибутами. Но вылетает на этой строке кода

//Generate attributed string
let attributedString = getAttributedTermsAndServicesText()

//crash after this line
cell.textView.attributedText = attributedString

Он печатает следующие детали в консоли,

-[__NSCFNumber _isDefaultFace]: нераспознанный селектор отправлен экземпляру 0x15d0d9c0 («4 libc++abi.dylib 0x1ca0798f + 78», «5 libc++abi.dylib 0x1ca07493 __cxa_rethrow + 90», «6 libobjc.A.dylib 0x1ca131ab rethrow + objc_exception 42", "7 CoreFoundation 0x1d699231 CFRunLoopRunSpecific + 600", "8 CoreFoundation 0x1d698fd1 CFRunLoopRunInMode + 104" ) 2018-06-06 02:52:07.439226-0700 MyApp[370:63347] * Завершение приложения из-за необработанного исключения NSInvalidArgumentException», причина: '- [__ NSCFNumber _isDefaultFace]: непризнанная Sent селектора экземпляр 0x15d0d9c0' * Первого стека кинуть вызов: (0x1d78bb3d 0x1ca13067 0x1d790fd1 0x1d78f0c3 0x1d6b7dc8 0x2292fe93 0x2292f727 0x2294bf4f 0x2294bc43 0x22a66523 0x1cc728 0x1c42c0 0x1cd0f0 0x22cebc13 0x22cebde5 0x22cd9d79 0x22cf08db 0x22a9cf0f 0x229bb483 0x20613cb7 0x20607d77 0x20607c05 0 x20596839 0x205b4fdb 0x205248e3 0x1f9c31bf 0x1d9dca7f 0x1d734c19 0x1d74865f 0x1d747ebd 0x1d745eab 0x1d6991af 0x1d698fd1 0x1ee43b41 0x22a21a53 0x28d578 0x1ce864eb) Libc ++ abi.dylib: оканчивающиеся неперехваченного исключением типа NSException

Но тем не менее, я не могу получить точную причину этого сбоя. Кто-нибудь сталкивался с такой проблемой раньше?


person Pramod More    schedule 06.06.2018    source источник
comment
NSAttributedStringKey.font, value: NSUnderlineStyle.styleSingle.rawValue Это не то значение, которое вам нужно. Вы устанавливаете Int (инкапсулированный в (NS)Number) вместо предоставления UIFont. Я думаю, что вы поставили неправильный NSAttributedStringKey.   -  person Larme    schedule 06.06.2018
comment
Первоначально этот код был в Swift 2, и недавно я преобразовал этот код для компиляции с помощью Swift 4.1, используя автоматическое преобразование Xcode.   -  person Pramod More    schedule 06.06.2018
comment
Измените .font на .understyle для второго: attributedString.addAttribute(NSAttributedStringKey.font, value: NSUnderlineStyle.styleSingle.rawValue, range: termsRange) =› attributedString.addAttribute(NSAttributedStringKey.underlineStyle, value: NSUnderlineStyle.styleSingle.rawValue, range: termsRange) Иначе это не имеет смысла. Кроме того, убедитесь, что .getLink() правильно возвращает UIFont.   -  person Larme    schedule 06.06.2018
comment
Спасибо за ваши предложения @Larme   -  person Pramod More    schedule 06.06.2018


Ответы (1)


пожалуйста, добавьте название и размер шрифта

func getAttributedTermsAndServicesText() -> NSAttributedString {
    let text = StringConstants.RegisterConstants.termsOfUseLabelText
    let attributedString = NSMutableAttributedString(string: text)
    let termsRange = attributedString.mutableString.range(of: StringConstants.CommonConstants.termsOfUse)

    attributedString.addAttribute(NSAttributedStringKey.link, value: WebViewLinkType.termsOfUse.getLink(), range: termsRange)
    attributedString.addAttribute(NSAttributedStringKey.underlineStyle, value: NSUnderlineStyle.styleSingle.rawValue, range: termsRange)

    let privacyRange = attributedString.mutableString.range(of: StringConstants.CommonConstants.privacyStatement)
    attributedString.addAttribute(NSAttributedStringKey.link, value: WebViewLinkType.privacyStatement.getLink(), range: privacyRange)
    attributedString.addAttribute(NSAttributedStringKey.underlineStyle, value: NSUnderlineStyle.styleSingle.rawValue, range: privacyRange)

    print(attributedString.mutableString)
    return attributedString
  } 
person Jigar    schedule 06.06.2018
comment
Зачем использовать NSFontAttributeName и NSAttributedStringKey.font одновременно? Это странно. - person Larme; 06.06.2018
comment
Спасибо за ваши усилия и предложения. Из обоих предложений я сделал свой ответ. - person Pramod More; 06.06.2018