Ios 按字母顺序对UITableView内容(通讯簿)进行排序
下面是我用来从设备中检索联系人列表的内容。我希望它按字母顺序显示,但使用堆栈溢出上看到的其他示例,我无法让它工作。 下面的代码来自一个教程,我需要怎么做才能按照字母顺序排序Ios 按字母顺序对UITableView内容(通讯簿)进行排序,ios,objective-c,xcode,uitableview,abaddressbook,Ios,Objective C,Xcode,Uitableview,Abaddressbook,下面是我用来从设备中检索联系人列表的内容。我希望它按字母顺序显示,但使用堆栈溢出上看到的其他示例,我无法让它工作。 下面的代码来自一个教程,我需要怎么做才能按照字母顺序排序 - (void)getPersonOutOfAddressBook { //1 CFErrorRef error = NULL; ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error); if (
- (void)getPersonOutOfAddressBook
{
//1
CFErrorRef error = NULL;
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);
if (addressBook != nil) {
NSLog(@"Succesful.");
//2
NSArray *allContacts = (__bridge_transfer NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);
//3
NSUInteger i = 0; for (i = 0; i < [allContacts count]; i++)
{
Person *person = [[Person alloc] init];
ABRecordRef contactPerson = (__bridge ABRecordRef)allContacts[i];
//4
NSString *firstName = (__bridge_transfer NSString *)ABRecordCopyValue(contactPerson,
kABPersonFirstNameProperty);
NSString *lastName = (__bridge_transfer NSString *)ABRecordCopyValue(contactPerson, kABPersonLastNameProperty);
NSString *fullName = [NSString stringWithFormat:@"%@ %@", firstName, lastName];
person.firstName = firstName; person.lastName = lastName;
person.fullName = fullName;
//email
//5
ABMultiValueRef emails = ABRecordCopyValue(contactPerson, kABPersonEmailProperty);
//6
NSUInteger j = 0;
for (j = 0; j < ABMultiValueGetCount(emails); j++) {
NSString *email = (__bridge_transfer NSString *)ABMultiValueCopyValueAtIndex(emails, j);
if (j == 0) {
person.homeEmail = email;
NSLog(@"person.homeEmail = %@ ", person.homeEmail);
}
else if (j==1) person.workEmail = email;
}
//7
[self.tableData addObject:person];
}
//8
CFRelease(addressBook);
} else {
//9
NSLog(@"Error reading Address Book");
}
}
我在下面试过
[self.tableData sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
我也尝试过
NSSortDescriptor
,但我没有可以排序的键。您需要实现并提供一种方法来排序Person记录,作为sortUsingSelector方法调用的选择器。您需要排序Person
对象数组。将它们全部添加到数组后,可以使用以下代码在fullName
上进行排序:
[self.tableData sortUsingComparator:^NSComparisonResult(Person *p1, Person *p2) {
return [p1.fullName compare:p2.fullName];
}];
备选方案
您可能希望在Person
对象上实现compare:
方法并在那里执行比较,这将保持排序逻辑的良好封装,并确保使用Person
对象的任何其他对象都可以轻松执行排序,而无需复制上面显示的代码
@implementation Person
// Mostly likely this implementation will contain more code, not shown for brevity
- (NSComparisonResult)compareByFullName:(Person *)otherPerson {
return [self.fullName compare:otherPerson.fullName];
}
@end
然后,您可以使用以下方法对阵列进行排序:
[self.tableData sortUsingSelector:@selector(compareByFullName:)];
我就这样解决了 //具有抓取属性的密钥NSArray*keys=@[CNContactFamilyNameKey、CNContactGivenNameKey、CNContactEmailAddressesKey];CNContactFetchRequest*请求=[[CNContactFetchRequest alloc]initWithKeyFetch:keys] //按姓氏排序联系人。request.sortOrder=CNContactSortOrderFamilyName --或者你可以--
//按姓名订购联系人。request.sortOrder=CNContactSortOrderGivenName 缺少的是进行排序的代码,您尝试了什么?@SteveWilford修改了原始帖子,使其更加清晰,感谢您的回答,尽管比较lastName(以及之后可能的firstName)可能比比较fullName更有用,以获得符合通常期望的排序行为。
[self.tableData sortUsingSelector:@selector(compareByFullName:)];