2016-05-31 5 views
0

ストーリーボードにNSArrayControllerが設定されています。ここでは、クライアントの名前を持つエンティティ名にモードを設定し、マネージオブジェクトコンテキスト、選択インデックス、ソートデスクリプタをバインドします。私のNSPopupButtonはそのアレイコントローラにリンクしています。実行すると、ボタンに必要な要素がすべて表示されます。ココアバインディングがいつ設定されるのですか

は今、私は私のコードで強い@IBOutletを作って、私は内容にアクセスしようとしている:

let objs = clientArrayController.arrangedObjects as! [Client] 
print("I have \(objs.count) clients") 

私はviewDidLoadviewWillAppearviewDidAppearでそのコードを試してみました。彼らはすべて0人のクライアントと言います。明らかに、私はクライアントがUIに表示されるので、それは不可能です。

私はここで間違っていますか?それゆえ、彼らは(正確に)ゼロの数を報告 -

+0

コードをメインループにスケジュールするようにしてください。アレイコントローラはすぐには充電されません。 –

+0

はい、それが満たされていることをどのように知っているのですか? – Gargoyle

+0

いつ監視対象の管理オブジェクトコンテキストを設定しますか? – Willeke

答えて

0

viewDidLoadviewWillAppear、およびviewDidAppearはおそらく、すべてのアレイコントローラは、コアデータストアからデータを収集し前に呼び出されます。あなたは変化に対応する機会を与えられている

// MyPopUpController.swift 

var ArrayControllerArrangedObjectsObservationContext = "arrayController.arrangedObjects" 


func viewDidLoad() { 
    arrayController.addObserver(self, 
     forKeyPath: "arrangedObjects", 
     options: .New | .Old, 
     context: &ArrayControllerArrangedObjectsObservationContext) 
} 

:ご使用のアレイコントローラのarrangedObjects配列への変更の言葉あなたはこのオブジェクトを監視し、変更を報告するオブザーバをインストールするには、前述の方法のいずれかを使用することができますを取得するには

// MyPopUpController.swift 

arrayController.removeObserver(self, 
    forKeyPath: "arrangedObjects", 
    context: &ArrayControllerArrangedObjectsObservationContext) 
01:あなたはあなたがオブザーバーを削除する必要が行う必要があるものは何でもカウントをチェックし、やった後 observeValueForKeyPath...

// MyPopUpController.swift 

override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) { 
    switch context { 
     case &ArrayControllerArrangedObjectsObservationContext: 
      // Check counts here 
     default: 
      super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context) 
} 

であなただけの、起動時に観測者が必要な場合

+0

醜いですが、それは目標を達成するでしょう。ありがとう。 – Gargoyle

関連する問題