Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 按字母顺序对UITableView内容(通讯簿)进行排序_Ios_Objective C_Xcode_Uitableview_Abaddressbook - Fatal编程技术网

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