Ошибка Swift 3: [_SwiftValue pointSize] непризнанный селектор, отправленный в экземпляр
Я просто перенес наш проект в swift 3 и вижу много сбоев из-за одной проблемы:
Завершение приложения из-за неперехваченного исключения "NSInvalidArgumentException", причина: '- [_ SwiftValue pointSize]: непризнанный селектор, отправленный экземпляру
Причиной этой ошибки является вызов:
[NSAttributedString(NSExtendedStringDrawing) boundingRectWithSize:options:context:]
Что я заметил, так это то, что если я передам String в 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 использует этот метод внутренне во многих частях
Ответы
Ответ 1
Если я использую ваш тестовый код, но пусть тип данных attributes
по умолчанию, он не сбой. То есть:
let attributes = [NSFontAttributeName: UIFont.systemFont(ofSize: 14)]
При нажатии на переменную переменная говорит [String : UIFont]
.
Немного дополнительного тестирования, предполагает, что он связан с необязательным объектом; [String: AnyObject]
работает нормально.
EDIT:
И после всего этого я решил прочитать документацию, в которой говорится использовать [String: Any]
.:)
Ответ 2
Следующее исправлено для меня:
let attributes: [String: UIFont] = [NSFontAttributeName: UIFont.systemFont(ofSize: 14)]
Ответ 3
Замена NSDictionary на [String: Any] устранит проблему.
let attributes: [String: Any] = [NSFontAttributeName: UIFont.systemFont(ofSize: 14)]
Ответ 4
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", fontSize: newFontSize, цвет: UIColor (красный: 41/255,0, зеленый: 192/255,0, синий: 42/255,0, alpha: 1.0))