有没有人用swift在xcode 6 beta中成功实现自定义NSValueTransformer?
我有以下快速课程:
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
}
}
所以这个变换器应该做的是,在gui中给一个给定的值加100.
如您所见,变压器类现在出现在IB中的Value Transformer下拉列表中。
但如果我选择这个变压器,应用程序会崩溃:
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 :(得分:39)
来自Xcode发行说明:
如果将NSValueTransformer的Swift子类设置为绑定值 变换器,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"作为名字......
答案 1 :(得分:2)
初始化 newTransformer 后,您还应该包含以下行:
NSValueTransformer.setValueTransformer(newTransformer, forName: "myTransformer")
然后在Interface Builder中,您应该在Value Transformer下拉列表中使用 myTransformer 而不是 newTransformer 。