2014-02-19 68 views
1

我有NSMutableArray可以包含兩個對象:的NSMutableArray按標題排序

NSString這一個:

@interface FileDownloadItem : NSObject 

@property (nonatomic, retain) NSString *title; 
....... 
@end 

,我希望能夠通過或標題或字符串到NSMutableArray排序。 之前,我在數組中有我NSString的使用這個命令:

NSSortDescriptor * sortDescriptor = [[[NSSortDescriptor alloc]initWithKey:@"title" ascending:YES selector:@selector(caseInsensitiveCompare:)] autorelease]; 

NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 
favoritesArray = [[NSMutableArray alloc] initWithArray:[[[FavoritesRep sharedFavoritesRep] favoritesArray] sortedArrayUsingDescriptors:sortDescriptors]]; 

但現在它只是崩潰。

+0

你可以添加的堆棧跟蹤你的崩潰? – bsarr007

+1

有一些協議您的自定義類需要堅持以使其在集合類中有用... – trojanfoe

+0

我理解數組中包含一個FileDownloadItem和一個NSString,而不是兩個FileDownloadItem是否正確? – Moonwalkr

回答

2

這裏有一個妥善的解決辦法:

NSArray *sortedArray = [myArrayToSort sortedArrayUsingComparator:^(id obj1, id obj2) { 
    if (! [obj1 isKindOfClass:[NSString class]]) 
     obj1 = [obj1 title]; 
    if (! [obj2 isKindOfClass:[NSString class]]) 
     obj2 = [obj2 title]; 
    return [obj1 caseInsensitiveCompare:obj2]; 
} 
+0

我在哪裏比較兩種物體? – MTA

+0

@MTA您不會:首先將這兩個對象轉換爲字符串,然後進行比較。 –

+0

這不起作用,因爲兩個對象都不是FileDownloadItems – Moonwalkr

0

這裏是一個黑客:

@interface NSString (title) 
- (NSString *)title; 
@end 

@implementation NSString (title) 
- (NSString *)title { return self; } 
@end 

有了這個,你可以保持你現有的代碼。但它使NSString的名稱空間混亂,不推薦用於生產代碼。

-1

因爲對象不同,iOS不知道什麼比較。您需要提供有關FileDownloadItem的哪部分與字符串進行比較的信息。你可以嘗試使用比較器。事情是這樣的:

NSArray *sortedArray = [yourArray sortedArrayUsingComparator:^(id obj1, id obj2) { 
    NSString *title = [obj1 valueForKeyPath:@"@title"]; 
    obj2; 
    return (NSComparisonResult)[title compare:obj2]; 
}]; 
+1

沒有downvote,但這是錯誤的:* * obj1和obj2都可以是NSString *或* FileDownloadItem。 –

+0

@MartinR真的,應該對他們進行測試。但後來我終於知道nikolai-ruhe後來回答了什麼,所以現在有點晚了:-) – Moonwalkr

0

這是最好的解決辦法:

@implementation FileDownloadItem 

- (NSString *)description 
{ 
    return self.title 
} 

@end 

排序只是略加修改排序描述使用現有代碼:

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"description" ascending:YES selector:@selector(caseInsensitiveCompare:)]; 
+0

這將用於比較,但可能會有其他含義,因爲描述可用於許多其他事情。 – Moonwalkr