Ошибка Swift 3: [SwiftValue pointSize] нераспознанный селектор, отправленный экземпляру
Я только что перенес наш проект на swift 3 и вижу много сбоев из-за одной проблемы:
завершение приложения из-за необнаруженного исключения "NSInvalidArgumentException", причина: "- [_SwiftValue pointSize]: нераспознанный селектор отправлен экземпляру
причиной этой ошибки является вызов:
[NSAttributedString(NSExtendedStringDrawing) boundingRectWithSize:options:context:]
Я заметил, что если я приведу строку к NSString и вызову boundingRectWithSize
на это он бросит эту ошибку. Это также, кажется, происходит в многие другие части, например, если я отправил заголовок контроллера вида в раскадровке, он выдает ту же ошибку.
У кого-нибудь такие же проблемы?
воспроизвести проблему:
создайте новый проект Swift 3 в Xcode 8 и добавьте следующую строку в viewDidLoad:
let attributes: [String: AnyObject?] = [
NSFontAttributeName: UIFont.systemFont(ofSize: 14)
]
let boundingRect = ("hello" as NSString).boundingRect(with: CGSize(width: 100, height: 100), options: .usesLineFragmentOrigin, attributes: attributes, context: nil)
но, как я уже сказал, он падает во многих других местах, поскольку кажется, что UIKit использует этот метод внутренне во многих частях
4 ответов
если я использую ваш тестовый код, но пусть тип данных attributes
по умолчанию, он не аварийно завершает работу. То есть:
let attributes = [NSFontAttributeName: UIFont.systemFont(ofSize: 14)]
на переменную говорит, что это [String : UIFont]
.
небольшое дополнительное тестирование предполагает, что оно связано с дополнительным объектом;[String: AnyObject]
кажется, работает нормально.
изменить:
И после всего этого я решил прочитать документацию, в которой говорится использовать [String: Any]
. :)
следующее исправлено для меня:
let attributes: [String: UIFont] = [NSFontAttributeName: UIFont.systemFont(ofSize: 14)]
замена NSDictionary на [String: Any] исправит проблему.
let attributes: [String: Any] = [NSFontAttributeName: UIFont.systemFont(ofSize: 14)]
func attributedString(firstText : String, amount : String, fontSize : CGFloat, color : UIColor) -> NSAttributedString {
let attrDict = [ NSFontAttributeName : UIFont(name: fontRegular, size: CGFloat(fontSize/2))!,
NSForegroundColorAttributeName : UIColor.darkGray] as [String : AnyObject]
let iconString = NSMutableAttributedString(string: firstText, attributes: attrDict)
let attrDict1 = [ NSFontAttributeName : UIFont(name: fontRegular, size: CGFloat(fontSize))!,
NSForegroundColorAttributeName : color] as [String : AnyObject]
let amountString = NSMutableAttributedString(string: amount, attributes: attrDict1)
iconString.append(amountString)
return iconString
}
и назовите это как
lblBalanceAmount.attributedText = self.attributedString(firstText: "Мой баланс", сумма: "500", размер шрифта: newFontSize, цвет : UIColor (красный: 41/255.0, зеленый: 192/255.0, синий: 42/255.0, Альфа: 1.0))