Пользовательский NSValueTransformer в xcode 6 с быстрым
Кто-нибудь успешно реализовал пользовательский NSValueTransformer в xcode 6 beta с быстрым?
У меня есть следующий быстрый класс:
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 к заданному значению в gui.
Как вы можете видеть, теперь класс трансформатора появляется в выводе 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()
}
Кто-нибудь знает, как все это должно работать?
добро пожаловать!
Мартин
Ответы
Ответ 1
После инициализации newTransformer вы также должны включить строку:
NSValueTransformer.setValueTransformer(newTransformer, forName: "myTransformer")
Затем в вашем построителе интерфейсов вы можете использовать myTransformer вместо newTransformer в раскрывающемся списке Value Transformer.
Ответ 2
Из примечаний к выпуску 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" как имя...