2011-03-11 23 views
0

我希望這是一個普遍的問題,一個相當廣泛的問題可能會有一個明顯的答案。爲什麼我的NSTableView - 在應用程序加載後 - 有時會填充來自其連接的數據源(核心數據)的數據,有時會爲空。它似乎是隨機的。退出和開始之間沒有任何變化。NSTableview在啓動時是隨機清空的

的幫助:

  • NSTableView數據源是一個NSArrayController綁定了一個實體核心數據模型managedObjectContext
  • NSTableViewNSArrayController都正確連接到插座和綁定。調試已經成功地進行了我所想到的任何測試,並且它隨機工作的事實表明某些工作正在進行。
  • 我打算假設問題是我的項目的一個元素,有時會在時間上加載,而沒有及時加載。我也曾假設在NSArrayController之前沒有在完成加載之前及時獲取其數據。我試圖通過詢問NSTableViewreloadDataNSArrayController加載完成後,以糾正這個:

[jobsController addObserver:self forKeyPath:@"arrangedObjects.jobTitle" options:0 context:nil];

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    if (object == jobsController) 
    { 
     NSLog(@"jobsController finished loading"); 
     [tableView reloadData]; 
    } 
} 

我使用一個獨立的測試按鈕爲NSTableView觸發reloadData還測試每當我點擊它。這沒有效果。對缺乏代碼抱歉。該項目相當龐大,很難將代碼隔離到這個問題上。我希望這個問題很普遍,以至於答案可能會從類似的經驗中得到確定。


更新

我很有信心,它是與沒有準備好NSArrayController的(作爲日誌的arrangedObjects揭示一個空集時表不填充,反之亦然做當它的時候)。爲了擴大我的設置,我還有另外兩個NSArrayController(總共3個)。填充NSTableView的控制器是另一個控制器的子控件。我有一個理論,只有當NSArrayControllers的加載順序是(巧合)parent> parent> parent時,該表纔會填充,因爲每個子對其內容集依賴其父NSArrayController。也許我的解決方案是手動選擇控制器的加載順序?

回答

0

我已經找到了答案,並認爲這種情況對其他人可能是可重複的,所以希望這對他們有用。我有我的'內容集'我的NSArrayController設置爲其父母NSArrayController逆關係。當我想用父數組的選定信息填充子數組時,這在項目的早些時候纔有意義。

在這種情況下,這個功能不再需要,所以我忘了它是這樣做的。結果,當應用程序啓動時,(看起來)隨機選擇頂部NSArrayController中的一個對象,並將其子對象NSArrayController填充爲僅與其所選父對象相關的對象。如果其中任何一個是空的,那麼將導致沒有任何對象過濾到填充NSTableView的孩子NSArrayController,並解釋爲什麼它看起來像它那樣隨機填充。

2

在你的tableview的awakeFromNib方法中調用數組控制器的fetch方法。這將使用所需的數據填充數組控制器,以便您調用reloadData實際上是要加載的數據。

+0

謝謝,這不幸的是不是答案,但很好的建議。 – biscuitstack 2011-03-12 12:00:26