2

我有一个 NSMutableArray,称为类别,其中包含一个名为 CategoryItem 的对象。CategoryItem 有一个 NSString 属性,*text。现在我将如何根据元素的 text 属性对该数组进行排序?对不起,如果这没有意义,我对这一切都是新手。

我试过这个:

[categories sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)];

但它失败了。

4

4 回答 4

10

那是因为您试图根据每个对象而不是它包含的字符串对数组进行排序。

您需要使用 NSSortDescriptor 的实例来对数组进行排序。您可以像这样创建一个:

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"text" ascending:YES];

然后:

[categories sortUsingDescriptors:[NSArray arrayWithObject:descriptor]];
于 2012-11-21T17:23:53.993 回答
7

试试这个:

[categories sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    CategoryItem object1 = (CategoryItem)obj1;
    CategoryItem object2 = (CategoryItem)obj2;
    return [object1.text compare:object2.text];
}];

希望有帮助!

于 2012-11-21T17:24:42.440 回答
4

它失败了,因为您没有为 CategoryItem 实现本地化CaseInsensitiveCompare。

如果您想这样做,请为 CategoryItem 实现该功能,例如

- (NSComparisonResult)localizedCaseInsensitiveCompare:(CategoryItem *)anItem
{
    return [anItem.stringProperty localizedCaseInsensitiveCompare:self.stringProperty];
}
于 2012-11-21T17:26:34.227 回答
2

你做得对。

问题是您正在尝试对字符串进行排序,但您没有字符串,您有 CategoryItems。为了保持相同的代码,您只需localizedCaseInsensitiveCompare:为 CategoryItem 实现。在该函数中,比较文本值并返回正确的NSComparisonResult. 大概是这样的

-(NSComparisonResult)localizedCaseInsensitiveCompare:(CategoryItem *)item2 {
    return [text localizedCaseInsensitiveCompare:[item2 text]];
}
于 2012-11-21T17:26:44.927 回答