2014-08-27 10 views
16

Czy ktoś z powodzeniem zaimplementował niestandardowy NSValueTransformer w wersji beta z kodem xcode 6 z szybkim?Niestandardowy NSValueTransformer w kodzie xcode 6 z szybkim

Mam następujący szybki Klasa:

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

Więc cały ten transformator powinien zrobić, to dodanie 100 do danej wartości w GUI.

Jak widać, klasa transformatora pojawia się teraz w menu rozwijanym Transformatora wartości w IB.

enter image description here

Ale jeśli wybiorę ten transformator awarie aplikacji z:

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' 

Czy to dobrze, aby zarejestrować ten transformator w AppDelegate z

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

Czy ktoś wie jak to całe rzeczy powinny działać?

Pozdrawiamy! Martin

+0

Przypuszczam, że to szybkie wymamienie nazwy. Spróbuj ogłosić to za pomocą @objc, aby ominąć to. –

Odpowiedz

3

Po inicjalizacji newTransformer należy również zawierać linię:

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

Następnie w interfejsie Builder należy używać myTransformer zamiast newTransformer pod rozwijanym Wartość transformatora.

+0

To nie jest najlepsza odpowiedź. – ioquatix

+0

przeczytaj odpowiedź poniżej! –

33

Od Xcode wydaniu:

Jeśli ustawisz Swift podklasę NSValueTransformer jako transformator wiążącej na wartość The XIB lub storyboard będzie zawierał nieprawidłowy odniesienie do klasy i wiązanie nie zadziała poprawnie w czasie wykonywania. Użytkownik może wprowadzić zmutowaną nazwę klasy w polu Transformator wartości lub dodać atrybut @objc (...) do podklasy NSValueTransformer do , aby rozwiązać ten problem. (17495784)

Od Swift przewodniku:

Aby dokonać Swift klasa dostępne i użyteczne z powrotem w Objective-C, zrobić mu potomka klasy Objective-C lub oznaczyć ją z @ atrybut objc . Aby określić konkretną nazwę klasy, która ma być używana w obiekcie Objective-C, należy ją oznaczyć za pomocą @objc (< # name #>), gdzie < # name #> to nazwa , której kod Objective-C użyje do odniesienia do Klasa Swift. Aby uzyskać więcej informacji na temat @objc, zobacz , zobacz temat Kompatybilność z typem Swift.

Rozwiązanie:

Deklarują swoją klasę jako @objc(myTransformer) class myTransformer: NSValueTransformer a następnie można użyć "myTransformer" jako nazwy ...

+0

Naprawiłem wszystko dla mnie. Kolejny świetny zasób, który pomógł - artykuł NSHipster o NSValueTransformer: http://nshipster.com/nsvaluetransformer/ –

+0

Dziękuję za doskonałą odpowiedź! – Satachito

+0

Właśnie miałem głosować i zdałem sobie sprawę, że miałem już kiedyś w przeszłości. ++ 2 –