2014-11-08 36 views
0

我有一個NSOutlineView顯示來自我的核心數據存儲的數據。數據是通過一個連接到我的managedObjectContext並使用NSTreeController顯示在NSOutlineView中的NSarrayController呈現的(非常類似於here)。我想過濾使用NSPredicate(或其他)顯示的數據,但是我無法使其工作。請注意,這是OSX而不是iOS,所以我不能使用NSFetchedResultsController。如何使用arrayController和核心數據的謂詞

我能夠檢索正確的數據並將它們存儲在NSArray中。但是,僅使用過濾的數據啓用我在outlineview中看到的自動更新不起作用。這是我目前有:

[arrayController setManagedObjectContext:_coreDataHelper.context]; 
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 

NSEntityDescription *entity = [NSEntityDescription entityForName:@"SDRDFileObject" 
              inManagedObjectContext:_coreDataHelper.context]; 

[request setEntity:entity]; 

NSNumber *directionLimit = @1; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"direction = %@", directionLimit]; 
[request setPredicate:predicate]; 

NSError *error; 
[arrayController setContent:[_coreDataHelper.context executeFetchRequest:request error:&error]]; 

[_coreDataHelper.context reset]; 
[arrayController fetch:self]; 
[outlineView reloadData]; 

正如你可以看到我的問題是接近這個one,但我還在掙扎。如果我確實需要使用setContent來爲arrayController工作,那麼我還會假設我會遇到Core Data上下文與arrayController內容不匹配的問題。建議或如何正確執行此操作的示例非常感謝。

回答

1

建議1:嘗試開啓陣列控制器。

我不完全知道是什麼,你指導我們是第一聯接筆者的目標,但他/她做一些事情,至少在最常見的NSOutlineView的設置,是有點奇怪。從核心數據提取值並將其顯示在大綱視圖中所需的唯一控制器對象是NSTreeController。另一方面,這個教程建議插入一個數組控制器:「在你的NIB文件中,你需要一個數組控制器綁定到你的NSManagedObjectContext,設置爲實體模式,並且父類的提取謂詞爲nil。頂級對象 - 沒有父級的實體「我的意見是,這是你應該用你的樹控制器而不是陣列控制器。考慮到細節,我認爲你應該做的第一件事就是讓數據只用樹形控制器正確顯示,一旦你達到了這個目標,你就可以開始考慮過濾大綱視圖。

建議2:過濾

不同於NSArrayControllerNSTreeController對象在它們的類引用無filterPredicate。我不確定這是爲什麼,但是有了大綱視圖,你必須自己實現過濾行爲。這可能有點棘手,但並不困難。例如,在我的其中一個項目中,我有一個大拖放兼容的樹形控制器/大綱視圖設置,當您在位於左下角的搜索欄中鍵入內容時,Xcode會過濾文件。我通過添加一個類別NSTreeController,並調用-filterContentUsingPredicate來返回一個數組。過濾完成後,我使用[-NSTreeController setContent:]的呼叫更新大綱視圖的內容以反映過濾器。

+0

謝謝!你是絕對正確的,我不需要'NSArrayController',我現在只剩下使用可以正常工作的treecontroller。正如你所建議的那樣,我實現了一個遞歸函數,以我想要的方式過濾'NSTtreeController',並且它可以工作。但是,它非常緩慢,因爲它不是並行地遍歷每個節點和父節點。如果你有如何實現你的filterContentUsingPredicate的示例代碼,將不勝感激。我會接受你的回答。 – 2014-11-10 00:07:57

+0

這聽起來像我的過濾程序不比你的更復雜。我還沒有完全學習如何使用線程,並且我也訪問了樹中的每個節點。到目前爲止,我發現它足夠快,適合我的目的,所以我沒有覺得有必要提出更復雜的解決方案。 – 2014-11-10 09:55:40