17

有没有人用 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
  }
}

所以这个转换器应该做的就是将 100 添加到 gui 中的给定值。

如您所见,转换器类现在出现在 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()
}

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

亲切的问候!马丁

4

2 回答 2

41

来自 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”作为名称...

于 2014-11-27T21:18:29.570 回答
2

初始化newTransformer后,还应该包括以下行:

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

然后在您的 Interface Builder 中,您应该在 Value Transformer 下拉菜单下使用myTransformer而不是newTransformer 。

于 2014-09-15T20:07:04.853 回答