2016-11-14 9 views
0

オプションのデータ型であるプロパティに対して、カカオバインディングを設定するにはどうすればよいですか?ココアスウィフトの任意のプロパティへのバインド

Iターンのように定義されている[プロパティ]の配列のためのオブジェクトを管理しているキーバインディングを介してNSArrayControllerはデータを表示NSTableView有する:私は

var properties: [Property] = [] 
    @IBOutlet var arrayController: NSArrayController! 
を定義MainViewControllerに

class Property: NSObject { 
     var distance: CLLocationDistance  
     var ETA: TimeInterval?     
     var coordinates: CLLocationCoordinate2D 
     // other properties and methods here 
    } 

をarrayControllerがpropertiesアレイに結合され

NSTableViewをアレイコントローラにバインドされている(コントロールキー= arrangedObjects) とテーブルセルビュー(モデルキーパス= objectValue.distanceなど)のさまざまなプロパティにバインドされたTableViewCells

コードは問題なくコンパイルされますが、実行時にテーブルをロードしようとするとクラッシュします。 properties.ETAはオプションであるため、問題はETA列にあります。この問題に対処する適切な方法は何ですか?ありがとうございました

答えて

0

少なくとも、直接にはできません。

Cocoa BindingsはObjective-Cランタイムを通じて動作し、ObjCはオブジェクト型(別名クラス参照型)ではないSwift Optionalsを表す方法がありません。 (それはあなたがInt?またはCGRect?またはTimeInterval?にObjCからNSWindow?にアクセスし、あるいはAnyObject?、ことはできませんが、である。)

ここにあなたの最善の策は戻って物事を行うにあなたが希望の道を秋に、おそらくですObjC - ETAを非オプションのTimeIntervalとし、ETAが設定されていない場合を表すために、いくつかのセンチネル値(負の何か巨大?)を使用します。バリュートランスを使用して、そのようなケースがUIで適切に表現されるようにすることができます。

代わりに、Swiftで使用するオプションのプロパティを保持し、バインドで使用する2番目の非オプションタイプの計算プロパティを公開することもできます。

+0

ありがとうございました! ObjCココアバインディングの起源を考えれば完全に意味をなさない。私は第2の代替(計算されたプロパティ)と一緒に行って、それは動作します。 –

関連する問題