Не удается преобразовать значение типа ‘NSAttributedString.DocumentAttributeKey’, «DocumentReadingOptionKey» также не работает

#swift #swift4 #nsattributedstring

#swift #swift4 #nsattributedstring

Вопрос:

Я обновился с Swift 3 до Swift 4 и получаю NSAttributedString соответствующую ошибку.

Вот мой код:

 viewModel.getInviteAFriendInfo(success: { message in
    if message.isEmpty{
        self.lblDetail.text = "xxxxxxx"
    }else{
        let htmlString: String = "<html><head><style xxxxxx </style></head><body>(message)</body></html>"
        self.lblDetail.setText(try! NSAttributedString(data: htmlString.data(using: .unicode, allowLossyConversion: true)!, options: [NSAttributedString.DocumentAttributeKey.documentType:NSAttributedString.DocumentType.html,NSAttributedStringKey.kern: 2.0], documentAttributes: nil))
    }
}, failure: {
    self.showAlert("Failed to get text")
})
 

Вот моя ошибка:

Не удается преобразовать значение типа ‘NSAttributedString.DocumentAttributeKey’ в ожидаемый тип ключа словаря ‘NSAttributedString.DocumentReadingOptionKey’

Прочитал некоторые опубликованные вопросы и решения, попытался изменить NSAttributedString.DocumentAttributedKey NSAttributedString.DocumentReadingOptionKey , но все равно получил ошибку.

Ответ №1:

Значение, которое вы пытаетесь передать options параметру, необходимо разделить.

Во-первых, documentType это from NSAttributedString.DocumentReadingOptionKey , а не NSAttributedString.DocumentAttributeKey .

Секунд, kern необходимо передать documentAttributes параметру, а не options параметру.

Это намного проще, если вы разделите код:

 let options: [NSAttributedString.DocumentReadingOptionKey : Any] = [ .documentType: NSAttributedString.DocumentType.html ]
let attributes = [ NSAttributedString.Key.kern: 2.0 ] as NSDictionary?
let data = htmlString.data(using: .utf8)!
let attrStr = try? NSAttributedString(data: data, options: options, documentAttributes: amp;attributes)
 

Комментарии:

1. Спасибо за вашу помощь, я пытаюсь найти, как получить HtmlString.data из HtmlString: String = «xxx» (извините, но я совсем новичок в iOS)

2. Смотрите мой обновленный ответ. Я забыл вернуться раньше и закончить это.

3. Большое вам спасибо за вашу любезную помощь! Я передал значение «attrStr» как «self.lblDetail.setText (attrStr)» . Ошибка исчезла! Исходный код действительно слишком длинный и запутанный. Здорово так разделять!

Ответ №2:

Попробуйте это

 var htmlString: String = "<html><head><style xxxxxx </style></head><body>(message)</body></html>"

if let attributedString = try? NSAttributedString(data: (htmlString.data(using: .unicode, allowLossyConversion: true)!), options: [.documentType: NSAttributedString.DocumentType.html], documentAttributes: nil) {
    self.lblDetail.attributedText = attributedString
}
 

Комментарии:

1. Спасибо за вашу помощь, это также исправило ошибку, но я не уверен, нормально ли, что «kern: 2.0» не используется.