我正在对联系信息数组进行排序,当我输入第一个名字并且最后一个用于特定联系时,它正常工作,但是当它缺少任何一个时它工作正常,
对于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];
答案 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
的比较器块使您能够创建所需的任何自定义排序条件。它只需返回NSOrderedAscending
,NSOrderedSame
或NSOrderedDescending
的{{3}}值之一(我方便地使用NSComparisonResult
为我生成)。有关搜索备选项列表,请参阅 NSArray类参考中列出的caseInsensitiveCompare
方法。