xcode swift nsvaluetransformer

NSValueTransformer personalizado en xcode 6 con swift



(2)

¿Alguien implementó con éxito un NSValueTransformer personalizado en xcode 6 beta con swift?

Tengo la siguiente clase de swift:

import Foundation class myTransformer: NSValueTransformer { let amount = 100 override class func transformedValueClass() -> AnyClass! { return NSNumber.self } override func transformedValue(value: AnyObject!) -> AnyObject! { return value.integerValue + amount } }

Así que todo lo que este transformador debería hacer es agregar 100 a un valor dado en la interfaz gráfica de usuario.

Como puede ver, la clase de transformador aparece ahora en el menú desplegable Transformador de valor en IB.

Pero si elijo este transformador, la aplicación falla con:

2014-08-27 20:12:17.686 cdTest[44134:303] *** Terminating app due to uncaught exception ''NSInternalInconsistencyException'', reason: ''Cannot find value transformer with name newTransformer''

¿Es correcto registrar este transformador en el AppDelegate con

override class func initialize() { let newTransformer = myTransformer() }

¿Alguien sabe cómo debería funcionar todo esto?

¡Saludos cordiales! martín


De las notas de lanzamiento de Xcode:

Si configura una subclase Swift de NSValueTransformer como transformador de valor de enlace, el XIB o el guión gráfico contendrá una referencia no válida a la clase y el enlace no funcionará correctamente en el tiempo de ejecución. Puede ingresar un nombre de clase mutilado en el campo Transformador de valor o agregar el atributo @objc (...) a la subclase NSValueTransformer para resolver este problema. (17495784)

De la guía Swift:

Para hacer que su clase Swift sea accesible y utilizable en Objective-C, conviértalo en un descendiente de una clase Objective-C o márquelo con el atributo @objc. Para especificar un nombre particular para la clase que se usará en Objective-C, márquelo con @objc (<# name #>), donde <# name #> es el nombre que su código Objective-C usará para hacer referencia a la clase Swift . Para obtener más información sobre @objc, consulte Compatibilidad de tipo Swift.

Solución:

Declare su clase como @objc(myTransformer) class myTransformer: NSValueTransformer y luego puede usar "myTransformer" como nombre ...


Después de inicializar newTransformer , también debe incluir la línea:

NSValueTransformer.setValueTransformer(newTransformer, forName: "myTransformer")

Luego, en su Interface Builder debe usar myTransformer en lugar de newTransformer en el menú desplegable de Value Transformer.