NSMutableArray按标题排序

时间:2014-02-19 08:44:15

标签: ios iphone objective-c

我有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]];

但现在它只是崩溃了。

4 个答案:

答案 0 :(得分: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];
}

答案 1 :(得分:0)

这是一个黑客:

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

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

这样您就可以保留现有代码。但它使NSString的命名空间变得混乱,不建议用于生产代码。

答案 2 :(得分:0)

这是最好的解决方案:

@implementation FileDownloadItem

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

@end

要使用略微修改的排序描述符对现有代码进行排序:

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

答案 3 :(得分:-1)

由于对象不同,iOS不知道要比较什么。您需要提供有关要与字符串进行比较的FileDownloadItem的哪些部分的信息。您可以尝试使用比较器。像这样:

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