2016-06-29 21 views
1

JSONからデータをインポートして、CollectionViewの一部のアイテムのモデルとして使用していますが、初期化されていると思われます。しかし、何らかの理由でrepresentedObject(以下、morphemeという別名)が最初にnilを返しています。したがって、nil値が表示されている場合はプレースホルダです。バインディングを使用するNSTextFieldsは初期化後に更新されません。

アイテムをクリックすると、クリックしたアイテムの名前がログに表示されるように設定されています。正常に動作し、デバッグのデフォルト値は返されません。だから私は同時進行性の問題が起こっていると推測しています。

詳細については、XCode 7がまだコレクションアイテムのプロトタイプでセグのバグを修正していないため、これは手動でプロトタイプ化されたアイテムです。ここで

私はうまくいけば、それは内のすべての重要な情報を取得するために管理スクリーンショットです:ここでは

enter image description here

が詳細にセルのコントローラー/ delagatingクラスのコードです:

///Acts as view controller for the items of the morpheme collection 
public class MorphemeCell: NSCollectionViewItem, NSTextViewDelegate{ 

    var backgroundColor = NSColor.clearColor() 

    var morphemeLabel: String{ 
     get{ 
      return morpheme?.morphemeDisplayName ?? "Morpheme" 
     } 
    } 

    var allomorphsLabel: String{ 
     get{ 
      return (morpheme?.allomorphsAsString ?? "Allomorphs") 
     } 
    } 

    ///The morpheme data contained in the cell 
    public var morpheme : Morpheme?{ 
     get{ 
      return representedObject as? Morpheme 
     } 
     set{ 
      representedObject = newValue 
     } 
    } 

    required public init?(coder: NSCoder) { 
     super.init(coder: coder) 
    } 

    ///Detects clicks on each item 
    public override func mouseUp(theEvent: NSEvent) { 
     Swift.print("Clicked on " + morphemeLabel) 
     backgroundColor = NSColor.blueColor() 
    } 
} 

わかりませんこれが必要な場合は、メインウィンドウのViewControllerがセットアップ/ロード機能を実行している場合にのみ使用します。

enter image description here

ロードコード自体:だから

///Loads morpheme data into memory and then into the collection view 
func loadMorphemeData(){ 
    //Open morphemes.json and begin parsing 
    let morphemeDataPath = "morphemes" 
    if let file = NSBundle.mainBundle().URLForResource(morphemeDataPath, withExtension: "json") 
    { 
     let data = NSData(contentsOfURL: file) 
     let json = JSON(data:data!) 

     //Create Morpheme objects passing in JSON elements 
     for morphemeElement in json{ 
      let toAdd = Morpheme(JSONElement: morphemeElement) 
      fullMorphemesList.append(toAdd) 
     } 
     ///TODO Use full range or filters in final product 
     let morphemesToLoad = fullMorphemesList[0...100] 
     collectionView.content.appendContentsOf(Array(morphemesToLoad) as [AnyObject]) 
    } 
    else 
    { 
     print("Resource Failure") 
    } 

、要約:私はどちらかcollectionViewのセットアップを遅らせる、またはデータがになったらラベルを更新する方法を見つける必要があると思わ。 ありがとうございました!私はCocoaフレームワークにはとても新しいので、それはちょっとしたことでした。

+3

スクリーンショットではなくコードを投稿 – vadian

+0

プロパティKVOは準拠していますか? – Willeke

+0

ああ、私はコードを忘れてしまったため、UIのアノテーションにはまってしまった。私はそれを更新しました。 私は完全にはわかりません。私はフレームワークにはとても新しいので、まだKVOのコンプライアンスを見ることはできませんでした。私はこれがライブバインディングの優先メソッドだと思いますか? – Alexandstein

答えて

2

別のルートをとってください:自分のラベルをself.morpheme.morphemeDisplayNameにバインドしてください。次に、 "Null Placeholder"テキストを "Morpheme"に設定します(その右パネルには、バインド設定の下のテキスト編集リストが表示されます)。最後に、プロパティmorphemeDisplayNameを動的に:

dynamic var morphemeDisplayName: String? 

を明らかに、あなたはもう、細胞内morphemeLabelプロパティを必要といけません。セルの

形態素プロパティは、同様に、ダイナミックでなければならない、またはセッターベースのプロパティがある場合、あなたが呼び出すことができます。元のポスターによる

set { 
willChangeValueForKey("morpheme") 
<whatever variable> = newValue 
didChangeValueForKey("morpheme") 
} 

編集:また

、結合を避けるために、同期の問題が発生した場合、viewDidLoad()の代わりにviewWillAppear()を使用すると、データの読み込みや「ラベルのフリーズ」に関する問題が発生していました。

+0

これを行うために、私はインスペクタのバインディングセクションに行き、モデルとしてCollectionItem(この場合はMorphemeCell)を選択し、 'モデルキーパス'として 'morphemeDisplayName'へのパスを使用しますか? また、 'will/didChangeValueForKey(String)'関数の場合、モデル/コントローラのプロパティを入れるだけですか、明示的にどこかのキーを作成する必要がありますか? – Alexandstein

+1

さて、あなたのプロパティ "morphemeDisplayName"はMorphemeクラスの中にあるので(あなたがそこに作成するはずです)、あなたの "モデルキーパス"はself.morpheme.morphemeDisplayName(オブジェクト階層を少し掘り下げる)になります。 2番目の部分については、すでにプロパティを持っています。ちょうどそれを飾る:public var morpheme:Morpheme?{ get { ?形態素 }集合{willChangeValueForKey( "形態素") representedObject = newValueに didChangeValueForKey( "形態素") }} –

+0

おかげでたくさん!正常に動作しているようです。 (時間は約半分ですが、起こっている可能性のある競合状態を回避するために並行処理をブラシする必要があるように見えます) – Alexandstein

関連する問題