Подтвердить что ты не робот

Ошибка 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 использует этот метод внутренне во многих частях

4b9b3361

Ответ 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))