使用Swift在Xcode 6中创建自定义NSValueTransformer

17

是否有人在Xcode 6 beta中成功地使用自定义NSValueTransformer并用Swift实现?

我有以下的Swift类:

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中的“值转换器”下拉菜单中。

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

有人知道这些东西应该如何运作吗?

诚挚问候! 马丁


我猜测这是Swift名称混淆的问题。尝试使用@objc声明来解决它。 - David Berry
2个回答

41
从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"作为名称...

这对我来说解决了所有问题。另一个非常好的资源是NSHipster关于NSValueTransformer的文章:http://nshipster.com/nsvaluetransformer/ - Sean Moubry
感谢您的完美答案! - Satachito
我正准备点赞这个,结果发现我在过去某个时候已经点过了。++2 - Chris Birch
2
很遗憾这不是标记为答案的那个!谢谢! - Francois T.

3

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

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

在您的Interface Builder中,您应该在“值转换器”下拉菜单中使用myTransformer而不是newTransformer


这不是最好的答案。 - ioquatix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接