Je viens de migrer notre projet vers Swift 3 et je vois beaucoup de plantages à cause d'un problème:
Arrêt de l'application en raison d'une exception non interceptée 'NSInvalidArgumentException', raison: '- [_ SwiftValue pointSize]: sélecteur non reconnu envoyé à l'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
, elle renvoie cette erreur. 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 est renvoyée.
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 dans de nombreux autres endroits, car il semble que UIKit utilise cette méthode en interne à de nombreuses reprises.
Si j'utilise votre code de test, mais laisse le type de données attributes
default, il ne plante pas. C'est:
let attributes = [NSFontAttributeName: UIFont.systemFont(ofSize: 14)]
Option-cliquant sur la variable dit que c'est [String : UIFont]
.
Un petit test supplémentaire suggère que cela est lié à l'objet optionnel; [String: AnyObject]
semble fonctionner correctement.
EDIT: .__ Et après tout cela, j’ai décidé de lire la documentation, qui dit d’utiliser [String: Any]
. :)
Ce qui suit l'a corrigé pour moi:
let attributes: [String: UIFont] = [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
}
Et appelle ça comme
lblBalanceAmount.attributedText = self.attributedString (firstText: "Mon solde", montant: "500", fontSize: newFontSize, couleur: UIColor (rouge: 41/255.0, vert: 192/255.0, bleu: 42/255.0, alpha: 1.0 ))
Remplacer NSDictionary par [String: Any] résoudra le problème .
let attributes: [String: Any] = [NSFontAttributeName: UIFont.systemFont(ofSize: 14)]