0

次のコードを使用して、アドレス帳のすべての連絡先の携帯電話番号 (つまり、最初の電話番号) を取得しています。これらすべての番号をに保存したいNSArray

self.dataSource = [[NSMutableArray alloc]init]; // dataSouce is delared in .h file
ABAddressBookRef addressBook = ABAddressBookCreate();
NSMutableArray *allPeople = (__bridge NSMutableArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);
int nPeople = ABAddressBookGetPersonCount(addressBook);

for(int i=0; i < nPeople; i++ ){
    ABRecordRef person = (__bridge ABRecordRef)([allPeople objectAtIndex:i]);
    NSString *name = @"";

    if(ABRecordCopyValue(person, kABPersonFirstNameProperty) != NULL)
        name = [[NSString stringWithFormat:@"%@", ABRecordCopyValue(person, kABPersonFirstNameProperty)] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
    [_dataSource addObject: name];

    ABMultiValueRef phoneNumberProperty = ABRecordCopyValue(person, kABPersonPhoneProperty);
    _phoneNumbers = (__bridge NSArray*)ABMultiValueCopyValueAtIndex(phoneNumberProperty, 0);
    CFRelease(phoneNumberProperty);
    NSLog(@"Phone numbers = %@", _phoneNumbers);
}

しかし、私が使用するNSLog(@"Phone numbers = %@", _phoneNumbers);と、出力は次のようになります

2012-11-07 15:31:06.116 contacts[4938:12b03] Phone numbers = 1 (800) 111-1111
2012-11-07 15:31:06.117 contacts[4938:12b03] Phone numbers = (222) 355-5668
2012-11-07 15:31:06.118 contacts[4938:12b03] Phone numbers = (910) 192-0192

NSArray次のような出力が必要です

Phone numbers = ( 
"1 (800) 111-1111",
"(222) 355-5668",
"(910) 192-0192" 
)

これどうやってするの ?

4

2 に答える 2

2

あなたはそれをすることができます

 self.dataSource = [[NSMutableArray alloc]init]; // dataSouce is delared in .h file
    ABAddressBookRef addressBook = ABAddressBookCreate();
    NSMutableArray *allPeople = (__bridge NSMutableArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);
    int nPeople = ABAddressBookGetPersonCount(addressBook);

    NSMutableArray *arrContacts = [[NSMutableArray alloc] init];

    for(int i=0; i < nPeople; i++ ){
        ABRecordRef person = (__bridge ABRecordRef)([allPeople objectAtIndex:i]);
        NSString *name = @"";

        if(ABRecordCopyValue(person, kABPersonFirstNameProperty) != NULL)
            name = [[NSString stringWithFormat:@"%@", ABRecordCopyValue(person, kABPersonFirstNameProperty)] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
        [_dataSource addObject: name];

        ABMultiValueRef phoneNumberProperty = ABRecordCopyValue(person, kABPersonPhoneProperty);
        _phoneNumbers = (__bridge NSArray*)ABMultiValueCopyValueAtIndex(phoneNumberProperty, 0);
        CFRelease(phoneNumberProperty);
        NSLog(@"Phone numbers = %@", _phoneNumbers);
        [arrContacts addObject:_phoneNumbers];
    }
    NSLog(@"Phone numbers : %@",arrContacts);
于 2012-11-07T11:00:52.167 に答える
1

Google 経由でこれを見つけ、このアドレス帳のコードを例として使用していましたが、ここに来る他の人のために訂正する間違いを見つけました。

使用ABMultiValueCopyValueAtIndexすると type を返しますCFTypeRef。その関数は、そのインデックス (この場合はインデックス 0) の電話番号のみを取得します。これは、電話番号の場合はCFStringRefにキャストされるべきではありませんNSArray*

ABMultiValueCopyArrayOfAllValues連絡先に保存されているすべての電話番号の配列を取得するための適切な呼び出しです。Sarafaraz が回答で行っているように、配列に格納してログに記録できます。

NSArray *_phoneNumbers = (__bridge NSArray*)ABMultiValueCopyArrayOfAllValues(phoneNumberProperty);

最初の電話番号だけを取得したい場合は、次のようにします。

CFStringRef phoneNumberRef = ABMultiValueCopyValueAtIndex(phoneNumberProperty, 0);
NSString *phoneString = (__bridge NSString*)phoneNumberRef;
于 2013-02-11T21:33:40.197 に答える