17

カスタム NSValueTransformer を xcode 6 ベータ版で迅速に実装した人はいますか?

私は次の迅速なクラスを持っています:

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 を加算することだけです。

ご覧のとおり、Transformer クラスは 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 ガイドから:

Objective-C で Swift クラスにアクセスして使用できるようにするには、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 に答える