2014-08-27 10 views
16

Hat jemand erfolgreich einen benutzerdefinierten NSValueTransformer in xcode 6 beta mit swift implementiert?Benutzerdefinierter NSValueTransformer in xcode 6 mit swift

Ich habe folgende swift Klasse:

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 
    } 
} 

Also das alles Transformator tun sollten, 100 auf einen bestimmten Wert in der gui hinzufügen.

Wie Sie sehen können, erscheint die Transformatorklasse jetzt in der Dropdownliste Wertumwandler in IB.

enter image description here

Aber wenn ich wählen diese Transformator die Anwendung abstürzt mit:

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' 

Ist es richtig, diesen Transformator im AppDelegate mit

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

Wer weiß, wie diese Das ganze Zeug sollte funktionieren?

Mit freundlichen Grüßen! martin

+0

Ich würde vermuten, dass es der schnelle Name Mangling ist. Versuchen Sie es mit @objc zu deklarieren, um das zu umgehen. –

Antwort

3

Nachdem Sie newTransformer initialisieren Sie auch die Zeile enthalten sollte:

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

Dann in Ihrem Interface Builder sollten Sie MyTransformer verwenden statt newTransformer unter dem Wert Transformator Dropdown-Menü.

+0

Dies ist nicht die beste Antwort. – ioquatix

+0

lesen Sie die Antwort unten! –

33

Von Xcode Release Notes:

Wenn Sie eine Swift Unterklasse von NSValueTransformer als Bindungswert Transformator gesetzt ist, wird die XIB oder Storyboard einen ungültigen Verweis auf die Klasse enthält, und die Bindung wird nicht funktionieren richtig zur Laufzeit. Sie können entweder einen verfälschten Klassennamen in das Werttransformerfeld eingeben oder das @objc (...) - Attribut der NSValueTransformer-Unterklasse zu hinzufügen, um dieses Problem zu lösen. (17495784)

Von Swift Führung:

Um Ihre Swift-Klasse zugänglich und nutzbar zurück in Objective-C zu machen, es machen einen Nachkommen einer Objective-C-Klasse oder es mit der Marke @ objc Attribut. Um einen bestimmten Namen für die Klasse anzugeben, die in Objective-C verwendet werden soll, markieren Sie sie mit @objc (< # name #>), wobei < # name #> der Name ist, den Ihr Objective-C-Code für die Referenz verwendet Schnelle Klasse. Für Weitere Informationen zu @objc finden Sie unter Swift-Typ-Kompatibilität.

Lösung:

Erklären Sie Ihre Klasse als @objc(myTransformer) class myTransformer: NSValueTransformer und dann können Sie "MyTransformer" als Namen verwenden ...

+0

Das hat alles für mich behoben. Eine weitere großartige Ressource, die geholfen hat - der NSHipster Artikel über NSValueTransformer: http://shipster.com/nsvaluetransformer/ –

+0

Vielen Dank für die perfekte Antwort! – Satachito

+0

Ich wollte gerade abstimmen und erkannte, dass ich schon einmal in der Vergangenheit war. ++ 2 –