NSSortDescriptor具有名字和姓氏,还是名字或姓氏?

时间:2012-12-14 05:16:37

标签: objective-c ios ipad nssortdescriptor

我正在对联系信息数组进行排序,当我输入第一个名字并且最后一个用于特定联系时,它正常工作,但是当它缺少任何一个时它工作正常,

对于Ex:如果我输入名字John和姓氏mickey,那么它会给出正确的排序,但是如果我只输入mickey,那么它最后会出现在UITableview的#section中,所以我需要在这里做什么案件类型。

我的代码如下,

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

1 个答案:

答案 0 :(得分:1)

如果您有custom criteria,则可以使用比较器块而不是描述符。例如,您可以使用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"}
];

并给我“Cher”,“Rob Ryan”,“Rob Zimmer”,“Smith”和“Sting”。

说实话,我并不完全清楚你想如何根据你的问题对它进行排序,但你明白了。 sortedArrayUsingComparator的比较器块使您能够创建所需的任何自定义排序条件。它只需返回NSOrderedAscendingNSOrderedSameNSOrderedDescending的{​​{3}}值之一(我方便地使用NSComparisonResult为我生成)。有关搜索备选项列表,请参阅 NSArray类参考中列出的caseInsensitiveCompare方法。

相关问题