2012-06-19 88 views
4

我必須要顯示在表格中那種我的業務對象的數組,準備下面的排序描述符,我從previous SO question你可以使用NSSortDescriptor進行排序的值不爲null嗎?

NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"awardedOn" ascending:NO]; 
NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES]; 
NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor1, sortDescriptor2, nil]; 
NSArray *sortedArray = [returnable sortedArrayUsingDescriptors:sortDescriptors]; 

是我的對象開始與一些示例代碼進行排序m顯示全部將有一個標題。只有其中一些會有一個「頒獎的」集,這是一個NSDate。

我想要做什麼:

  1. 排序整個數組,因此所有與「awardedOn」集中的對象顯示在頂部
  2. 中的兩個「套」 ,責令其按字母順序
  3. 我不關心日期的實際價值,我更感興趣的 如果它存在與否

像這樣的東西(頭銜,大膽的人有awardedOn

  • 真棒值)
  • 更好
  • 另一個
  • 另外一個
  • 還有一個
  • 然而,另一個

回答

1

您應該能夠通過awardedOn做到這一點使用兩個描述像你先說,首先,再由稱號。但是,您需要爲awardedOn提供一個自定義NSSortDescriptor那種看起來成才這樣的:

#define NULL_OBJECT(a) ((a) == nil || [(a) isEqual:[NSNull null]]) 
@interface AwardedOnSortDescriptor : NSSortDescriptor {} 
@end 
@implementation AwardedOnSortDescriptor 
- (id)copyWithZone:(NSZone*)zone 
{ 
    return [[[self class] alloc] initWithKey:[self key] ascending:[self ascending] selector:[self selector]]; 
} 
- (NSComparisonResult)compareObject:(id)object1 toObject:(id)object2 
{ 
    if (NULL_OBJECT([object1 valueForKeyPath:[self key]])) { 
     if (NULL_OBJECT([object2 valueForKeyPath:[self key]])) 
      return NSOrderedSame; // If both objects have no awardedOn field, they are in the same "set" 
     return NSOrderedDescending; // If the first one has no awardedOn, it is sorted after   
    } 
    if (NULL_OBJECT([object2 valueForKeyPath:[self key]])) { 
     return NSOrderedAscending; // If the second one has no awardedOn, it is sorted after 
    } 
    return NSOrderedSame; // If they both have an awardedOn field, they are in the same "set" 
} 
@end 

這將讓你有分離集:真棒/更好/酷和另一個/另1個/ 1更多/在另一個例子中。在這之後,你要善於用:

NSSortDescriptor *sortDescriptor1 = [[AwardedOnSortDescriptor alloc] initWithKey:@"awardedOn" ascending:YES]; 
NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES]; 

最後要注意,你可能需要一個豆蔻更多的工作,這取決於你的「空」 awardedOn領域的樣子(我以爲,在上面的代碼,該字段被設置爲空)。你可以看看這裏:https://stackoverflow.com/a/3145789

+1

我寫過一個基於Swift中的這個答案的類。 https://gist.github.com/evgeniyd/d974121b94b17931480c –

+0

這是真棒尤金!謝謝:) 我還建議你添加另一個有空的對象在升序爲真時。 – ameunier

1

有兩種可能的方式:

  1. 當創建一個業務對象,分配awardedOn日期distantPast如果它不存在,然後通過awardedOn做正常的排序,然後通過title

  2. 創建自定義的比較方法排序描述符,將每個業務對象的調用:

NSSortDescriptor *awardDescriptor = [NSSortDescriptor descriptorWithKey:@"awardedOn" 
                   ascending:NO 
                   selector:@selector(compareAwardedOn:)]; 

// In class for business object 
- (NSComparisonResult)compareAwardedOn:(id)otherBusiness { 
    // return custom NSComparison result after 
    // checking whether either of awardedOn dates are nil. 
    return NSOrderedSame; 
} 
+0

這是如何考慮到對標題的排序呢? – Jimmy

+0

不同的屬性使用不同的排序描述符。您將一組描述符傳遞給一組業務對象。 – Eimantas

0

嘗試使用比較:

_finalArray = [_array sortedArrayUsingComparator: ^NSComparisonResult(NSDictionary *obj1, NSDictionary *obj2) 
       { 
        if([[obj1 [email protected]"awardedOn"] lenght] && ![[obj2 [email protected]"awardedOn"] lenght]) 
         return NSOrderedDescending; 
        if([[obj2 [email protected]"awardedOn"] lenght] && ![[obj1 [email protected]"awardedOn"] lenght]) 
         return NSOrderedAscending; 
        return NSOrderedSame; 
       }]; 
+0

不考慮'title' – Jimmy

+0

每個'lenght'都應該是'length'並且在每個'valueForKey'後面都會有一個冒號':'valueForKey:@「awardsOn」' – Salim

相關問題