28 votes

Erreur Swift 3 : [_SwiftValue pointSize] sélecteur non reconnu envoyé à l'instance

Je viens de migrer notre projet vers swift 3 et je vois beaucoup de plantages à cause d'un problème :

Fermeture de l'application en raison de l'exception 'NSInvalidArgumentException', reason : '-[_SwiftValue pointSize] : unrecognized selector sent to instance'.

La raison de cette erreur est l'appel à :

[NSAttributedString(NSExtendedStringDrawing) boundingRectWithSize:options:context:]

Ce que j'ai remarqué, c'est que si je transforme String en NSString et que j'appelle boundingRectWithSize sur elle, cette erreur se produira. Cela semble également se produire dans de nombreuses autres parties, par exemple si j'envoie un titre de contrôleur de vue dans un storyboard, la même erreur se produit.

Quelqu'un a les mêmes problèmes ?

Pour reproduire le problème :

Créez un nouveau projet Swift 3 dans Xcode 8 et ajoutez la ligne suivante dans 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)

Mais comme je l'ai dit, il se bloque à de nombreux autres endroits car il semble que UIKit utilise cette méthode en interne dans de nombreux endroits.

26voto

Phillip Mills Points 16240

Si j'utilise votre code de test, mais laisse le type de données de attributes par défaut, il ne se plante pas. C'est-à-dire :

let attributes = [NSFontAttributeName: UIFont.systemFont(ofSize: 14)]

Un clic d'option sur la variable indique qu'elle est [String : UIFont] .

Un petit test supplémentaire, suggère que c'est lié à l'objet optionnel ; [String: AnyObject] semble fonctionner correctement.

EDIT : Et après tout ça, j'ai décidé de lire la documentation, qui dit d'utiliser [String: Any] . :)

1voto

Hamza Azad Points 2327

Ce qui suit a réglé le problème pour moi :

let attributes: [String: UIFont] = [NSFontAttributeName: UIFont.systemFont(ofSize: 14)]

0voto

EIMEI Points 41

Remplacer NSDictionary par [String : Any] résoudra le problème. let attributes: [String: Any] = [NSFontAttributeName: UIFont.systemFont(ofSize: 14)]

0voto

Ga Ne Sh Points 39
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
}

Et l'appeler comme

lblBalanceAmount.attributedText = self.attributedString(firstText : "Mon solde", amount : "500", fontSize : newFontSize, color : UIColor(red : 41/255.0, green : 192/255.0, blue : 42/255.0, alpha : 1.0))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X