使用swift在xcode 6中自定义NSValueTransformer

时间:2014-08-27 18:17:41

标签: xcode swift nsvaluetransformer

有没有人用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下拉列表中。

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

有谁知道这整个东西应该如何运作?

亲切的问候! 马丁

2 个答案:

答案 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