2012-05-19 77 views
0

有什麼方法可以重新排列使用核心數據的表視圖的部分,而無需使用排序描述符?
我需要的排序方式不是按字母順序排列,並且會隨時間而變化(我已經閱讀過,使用核心數據,不能使用自定義選擇器作爲排序描述符,所以默認選擇器不能幫助我)。如何在使用核心數據時重新排列部分

我有一個方法,當「部分重新排序」應該發生時被調用,我不知道是否有某種「索引向量」,我可以修改,所以部分由該索引或類似的東西排序。
感謝您的幫助!

回答

1

你這裏有兩種選擇:要在覈心數據訂購


任何事情(和,通過擴展,使用NSFetchedResultsController),您需要在您的數據,並使用排序描述符莫名其妙模型。

您聲明(但不解釋)「缺省的[排序描述符]沒有幫助」你。我想這意味着使用模型中包含的數據不足以進行重新排序。在這種情況下,您將不得不爲相關實體引入一個新屬性。這可能聽起來太費勁了,但通常情況並非如此。


可以從讀取的結果控制器的表格視圖的datasource更改爲自己方案(例如,用陣列)。當然,這會影響內存,但這可能是最簡單的方法。

編輯
後你重述問題(圓形矢量排序)這裏是一個建議:你可以使用sortDescriptorWithKey:ascending:comparator:構建一種描述符,提供正是你想要的結果。 (警告:未經測試的代碼

int centerNumber = 2; // or whatever your method returns 
NSSortDescriptor *descriptor = [NSSortDescriptor 
    sortDescriptorWithKey:@"number" 
       ascending:YES 
        comparator:^(int a, int b) { 
    NSComparisonResult r; 
    if (a == b) r = NSOrderedSame; 
    else if (a == centerNumber) r = NSOrderedAscending; 
    else if (b == centerNumber) r = NSOrderedDescending; 
    else if (abs(a-c) == abs(b-c)) 
     if (a<b) r = NSOrderedDescending; 
     else r = NSOrderedAscending; 
    else 
     if (abs(a-c) > abs(b-c)) r = NSOrderedAscending; 
     else r = NSOrderedDescending; 
    return r; 
}]; 

讓我知道,如果它的工作原理。

EDIT 2
如果你需要的NSNumber(這是你的數據是如何存儲的最有可能的),也許這個作品:

...^(id x, id y) { 
    int a = [x intValue]; 
    int b = [y intValue]; 
    ... 
}... 

最後編輯

如果比較不工作,插入NSComparisonResult作爲結果類型:

...comparator:^NSComparisonResult(id x, id y){.... 
+0

嗯,也許我錯過了有關排序描述符的內容。我的模型中有一個存儲數字(1到5)的屬性,我想從需要重新排序時觸發的方法開始排序。例如,如果方法顯示爲「2」,我希望這些部分按「2,3,1,4,5」排序。也就是說,首先是方法所說的那個,然後是「圓形矢量」方式中的+1和-1,即+2 -2等。這可以使用默認的排序描述符來完成嗎? – David

+0

它可以通過使用自定義比較選擇器來完成。看我的編輯。 – Mundi

+0

好吧,我試圖設置提取的結果控制器使用這種排序描述符處理請求,但它不執行比較器!我已經測試了這個比較器,它的工作原理,如果我把一個NSLog裏面,它會被調用。但是,將它設置爲比較器時,它不會被調用,這些部分不會被重新排序,控制檯中也沒有NSLog。我確定我正確設置了獲取的結果控制器(排序描述符的「升序」參數)。問題在哪裏? :S – David

相關問題