Ошибка 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))