2014-08-27 3 views
16

Кто-нибудь успешно реализовал пользовательский NSValueTransformer в xcode 6 beta с быстрым?Пользовательский NSValueTransformer в xcode 6 с быстрым

У меня есть следующий быстрый класс:

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

Так что все это трансформатор должен сделать это, добавив 100 до заданного значения в графическом интерфейсе.

Как вы можете видеть, теперь класс трансформаторов появляется в выводе Value Transformer в IB.

enter image description here

Но если я выбираю этот трансформатор сбои приложений с помощью:

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' 

Правильно ли зарегистрировать этот трансформатор в AppDelegate с

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

Кто-нибудь знает, как это весь материал должен работать?

вид привет! мартин

+0

Я бы предположил, что это быстрое название. Попробуйте объявить об этом с помощью @objc, чтобы обойти это. –

ответ

3

После инициализации newTransformer вы должны также включить строку:

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

Затем в Interface Builder, вы должны использовать myTransformer вместо newTransformer под выпадающего меню Value Transformer.

+0

Это не лучший ответ. – ioquatix

+0

прочитайте ответ ниже! –

33

От Xcode примечания к выпуску:

Если вы установили Swift подкласс NSValueTransformer в качестве обязательного своей стоимости трансформатора, то XIB или раскадровка будет содержать неверную ссылку к классу, и связывания не будет работать правильно во время выполнения. Вы, , можете либо ввести искомое имя класса в поле Value Transformer , либо добавить атрибут @objc (...) в подкласс NSValueTransformer до решить эту проблему. (17495784)

От Swift руководство:

Чтобы сделать ваш Swift класс доступен и использовать обратно в Objective-C, сделать его потомком класса Objective-C или пометить его с @ objc атрибут. Чтобы указать конкретное имя для класса, используемого в Objective-C, отметьте его @objc (< # name #>), где < # name #> - это имя , что ваш код Objective-C будет использовать для ссылки на Swift класс. Для дополнительную информацию о @objc см. В разделе Совместимость типов Swift.

Решение:

Объявите свой класс как @objc(myTransformer) class myTransformer: NSValueTransformer, а затем вы можете использовать "myTransformer" в качестве имени ...

+0

Это фиксировало все для меня. Еще один отличный ресурс, который помог - статья NSHipster о NSValueTransformer: http://nshipster.com/nsvaluetransformer/ –

+0

Спасибо за прекрасный ответ! – Satachito

+0

Я как раз собирался проголосовать за это и понял, что уже когда-то был в прошлом. ++ 2 –

Смежные вопросы