2

我正在对联系人信息数组进行排序,当我输入特定联系人的名字和姓氏时它工作正常,但是当其中任何一个丢失时它都不能正常工作,

例如:如果我输入名字 John 和姓氏 mickey,那么它会给出正确的排序,但是如果我只输入 mickey,那么它最后会出现在 UITableview 的 # 部分中。所以在这种情况下我需要在这里做什么.

我的代码如下,

NSSortDescriptor *sortDescriptorFirstName = [[[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES selector:@selector(localizedStandardCompare:)] autorelease];

NSSortDescriptor *sortDescriptorLastName = [[[NSSortDescriptor alloc] initWithKey:@"lastName" ascending:YES selector:@selector(localizedStandardCompare:)] autorelease];

NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptorFirstName,sortDescriptorLastName,nil];

if(favFlag){
    favContacts = [[contactsData sortedArrayUsingDescriptors:sortDescriptors] mutableCopy];
    [self setListContent:favContacts];
}
else {
    contacts = [[contactsData sortedArrayUsingDescriptors:sortDescriptors] mutableCopy];
    [self setListContent:contacts];
}

[contactTableView reloadData];
4

1 回答 1

1

如果您有自定义条件,则可以使用比较器块而不是描述符。例如,您可以使用sortedArrayUsingComparator

contacts = [contactsData sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    NSString *sortName1 = [self sortNameWithFirst:[obj1 objectForKey:@"firstName"]
                                             last:[obj1 objectForKey:@"lastName"]];

    NSString *sortName2 = [self sortNameWithFirst:[obj2 objectForKey:@"firstName"]
                                             last:[obj2 objectForKey:@"lastName"]];

    return [sortName1 caseInsensitiveCompare:sortName2];
}];

我有这个小实用方法可以更轻松地创建“排序名称”,这是我最终要排序的字符串的术语:

- (NSString *)sortNameWithFirst:(NSString *)firstName last:(NSString *)lastName
{
    if (firstName && lastName)
        return [NSString stringWithFormat:@"%@ %@", firstName, lastName];
    if (firstName)
        return firstName;
    if (lastName)
        return lastName;
    return nil;
}

此代码采用此列表:

NSArray *contactsData = @[
    @{@"firstName":@"Rob", @"lastName":@"Zimmer"},
    @{@"firstName":@"Sting"},
    @{@"firstName":@"Rob", @"lastName":@"Ryan"},
    @{@"firstName":@"Cher"},
    @{@"lastName":@"Smith"}
];

并给了我“雪儿”、“罗布瑞恩”、“罗布齐默”、“史密斯”和“斯汀”。

老实说,我并不完全清楚你想如何根据你的问题对其进行排序,但你明白了。比较器块sortedArrayUsingComparator使您能够创建所需的任何自定义排序标准。它只需要返回 、 或 的值之一NSComparisonResult(我方便地使用它为我生成)。有关搜索替代方案的列表,请参阅NSArray 类参考中列出的排序方法。NSOrderedAscendingNSOrderedSameNSOrderedDescendingcaseInsensitiveCompare

于 2012-12-14T07:09:12.130 回答