使用 swift 在 xcode 6 中自定义 NSValueTransformer

Posted

技术标签:

【中文标题】使用 swift 在 xcode 6 中自定义 NSValueTransformer【英文标题】:Custom NSValueTransformer in xcode 6 with swift 【发布时间】:2014-08-27 18:17:41 【问题描述】:

有人在 xcode 6 beta 中使用 swift 成功实现了自定义 NSValueTransformer 吗?

我有以下 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
  

所以这个转换器应该做的就是将 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中注册这个transformer对吗

override class func initialize() 
  let newTransformer = myTransformer()

有谁知道这一切应该如何运作?

亲切的问候! 马丁

【问题讨论】:

我猜这是快速名称修饰。尝试用 @objc 声明它来解决这个问题。 【参考方案1】:

来自 Xcode 发行说明:

如果您将 NSValueTransformer 的 Swift 子类设置为绑定的值 变压器,XIB 或情节提要将包含无效的参考 到类,并且绑定在运行时将无法正常工作。你 可以在 Value Transformer 字段中输入一个损坏的类名 或者将@objc(…) 属性添加到 NSValueTransformer 子类中 解决这个问题。 (17495784)

来自 Swift 指南:

为了让您的 Swift 类在 Objective-C 中可访问和可用, 使其成为 Objective-C 类的后代或使用 @objc 标记它 属性。为要使用的类指定特定名称 Objective-C,用 @objc() 标记它,其中 是名称 您的 Objective-C 代码将用于引用 Swift 类。为了 有关 @objc 的更多信息,请参阅 Swift 类型兼容性。

解决方案:

将您的班级声明为@objc(myTransformer) class myTransformer: NSValueTransformer,然后您可以使用“myTransformer”作为名称...

【讨论】:

这为我解决了一切问题。另一个有用的资源——关于 NSValueTransformer 的 NSHipster 文章:nshipster.com/nsvaluetransformer 感谢您的完美回答! 我正要对此投赞成票,但意识到我已经在过去的某个时候投了赞成票。 ++2 谢谢!可惜这不是被标记为答案的那个!【参考方案2】:

在初始化 newTransformer 之后,您还应该包含以下行:

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

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

【讨论】:

这不是最佳答案。

以上是关于使用 swift 在 xcode 6 中自定义 NSValueTransformer的主要内容,如果未能解决你的问题,请参考以下文章

如何将自定义视图拖动为 Xcode 6 中自定义视图的私有属性

如何在 Swift 中自定义 UISlider 值

在 Xcode 6 中使用自定义字体 - Swift [重复]

使用 Swift 在 Xcode 6 中使用 xib 在自定义 uiview 中获取 SIGABRT

UITableViewRowAction 在 Swift 中自定义标题字体大小

使用 SKSpritenodes/碰撞检测在 Swift 中自定义类