ios swift string nsstring uifont

ios - Error de Swift 3:[_SwiftValue pointSize] selector no reconocido enviado a la instancia



string nsstring (4)

Acabo de migrar nuestro proyecto a Swift 3 y veo muchos bloqueos debido a un problema:

Aplicación finalizada debido a la excepción no detectada ''NSInvalidArgumentException'', razón: ''- [_ SwiftValue pointSize]: selector no reconocido enviado a la instancia

La razón de ese error es la llamada a:

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

Lo que noté es que si lanzo Cadena a NSString y llamo a boundingRectWithSize en él, lanzará ese error. También parece estar sucediendo en muchas otras partes, por ejemplo, si envié un título de controlador de vista en un guión gráfico, se produce el mismo error.

¿Alguien que tenga los mismos problemas?

Para reproducir el problema:

Cree un nuevo proyecto Swift 3 en Xcode 8 y agregue la siguiente línea en 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)

Pero como dije, se bloquea en muchos otros lugares, ya que parece que UIKit usa este método internamente en muchas partes.


Lo siguiente lo arreglé para mí:

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


Reemplazar NSDictionary con [Cadena: Cualquiera] solucionará el problema. let attributes: [String: Any] = [NSFontAttributeName: UIFont.systemFont(ofSize: 14)]


Si utilizo su código de prueba, pero deja el tipo de datos de los attributes predeterminados, no se bloquea. Es decir:

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

Opción al hacer clic en la variable dice que es [String : UIFont] .

Una pequeña prueba adicional, sugiere que está relacionado con el objeto opcional; [String: AnyObject] parece funcionar bien.

EDIT: Y después de todo eso, decidí leer la documentación, que dice usar [String: Any] . :)


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 }

Y llamalo como

lblBalanceAmount.attributedText = self.attributedString (firstText: "My Balance", cantidad: "500", fontSize: newFontSize, color: UIColor (rojo: 41 / 255.0, verde: 192 / 255.0, azul: 42 / 255.0, alpha: 1.0 ))