2 Stimmen

Wie man eine Telefonnummer von einem Adressbuch Kontakt (iphone sdk) bekommen.

Ich zeige dem Benutzer eine Adressbuchansicht und lasse ihn auf einen Kontakt klicken und eine Telefonnummer auswählen. Wenn er eine Telefonnummer auswählt, möchte ich die Telefonnummer als Ganzzahl und den Namen des Kontakts als NSString bekommen.

Ich habe versucht, es mit folgendem Code zu tun:

    //printf("%s\n",[[(NSArray *)ABMultiValueCopyArrayOfAllValues(theProperty) objectAtIndex:identifier] UTF8String]);

    //CFArrayRef *arrayString = [[(NSArray *)ABMultiValueCopyArrayOfAllValues(theProperty) objectAtIndex:identifier] UTF8String];
    NSArray *arrayString = [(NSArray *)ABMultiValueCopyArrayOfAllValues(theProperty) objectAtIndex:identifier];
    printf("%s\n", arrayString);

Dieser Code befindet sich innerhalb dieser Methode:

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier

Und ich überprüfe, ob der Benutzer eine Telefonnummer ausgewählt hat, mit diesem Code:

if (propertyType == kABStringPropertyType)   
{
    [self wrongSelection];

} 
else if (propertyType == kABIntegerPropertyType)     
{
    [self wrongSelection];

} 
else if (propertyType == kABRealPropertyType)    
{
    [self wrongSelection];
} 
else if (propertyType == kABMultiStringPropertyType)     
{
     //Das ist die Telefonnummer...

Ich kann die Telefonnummer im Konsolenfenster anzeigen lassen mit printf, aber ich kann nicht herausfinden, wie ich sie in eine Ganzzahl umwandeln und auch den Namen des Kontakts erhalten kann, auch wenn die ausgewählte Eigenschaft nicht der Name einer Person ist.

Außerdem scheint das, was ich tue, sehr ineffizient zu sein. Gibt es bessere Möglichkeiten, das zu tun?

Bearbeitung: Wenn ich sie nicht als Ganzzahl speichern kann, wäre auch eine Zeichenfolge in Ordnung. Ich kann einfach nicht herausfinden, wie ich von diesem Array zu einer tatsächlichen Zeichenfolge komme. Wenn ich es umwandle oder als UTF8String speichere, erhalte ich immer einen Fehler.

14voto

Jason Coco Punkte 77369

Um die Eigenschaft effizient zu erhalten (was das Lesen betrifft), können Sie in Ihrer Rückruffunktion folgendes tun:

switch( propertyType ) {
  case kABMultiStringPropertyType:
    // dies ist die Telefonnummer, mach etwas
    break;
  default:
    [self wrongSelection];
    break;
}

Ich bin mir nicht sicher, ob Sie das tatsächlich parsen müssen. Um die Telefonnummer aus dem Datensatz zu erhalten, könnten Sie (wiederum innerhalb Ihrer Rückruffunktion) folgendes tun:

ABMultiValueRef phoneNumberProperty = ABRecordCopyValue(person, kABPersonPhoneProperty);
NSArray* phoneNumbers = (NSArray*)ABMultiValueCopyArrayOfAllValues(phoneNumberProperty);
CFRelease(phoneNUmberProperty);

// Machen Sie, was Sie mit den Telefonnummern möchten
NSLog(@"Telefonnummern = %@", phoneNumbers);
[phoneNumbers release];

5voto

Louis Gerbarg Punkte 43196

Sie können die Telefonnummer nicht in eine Ganzzahl umwandeln. Telefonnummern sind Zeichenfolgen. Der Standardeintrag von Apple für sich selbst enthält die Nummer "1-800-MYAPPLE".

Selbst wenn alle Komponenten einer Telefonnummer Ziffern sind, gibt es keine Garantie dafür, dass Telefonnummern in allen Teilen der Welt tatsächlich klein genug sind, um in einen 64-Bit-Wert zu passen, wenn Sie Vorwahlen, Ländercodes, interne Erweiterungen usw. berücksichtigen. Benutzer können so viel wie sie möchten hinzufügen .

3voto

Dan J Punkte 24945

Noch ein Grund, um keine Ganzzahlen zu verwenden - einige Länder verwenden führende Nullen bei Telefonnummern, z.B. alle britischen Nummern beginnen mit einer Null (normalerweise geschrieben als 01234 567890 oder 0123 4567890)!

2voto

Ed Marty Punkte 39312
CFStringRef cfName = ABRecordCopyCompositeName(person);
NSString *personName = [NSString stringWithString:(NSString *)cfName];
CFRelease(cfName);

ABMultiValueRef container = ABRecordCopyValue(person, property);
CFStringRef contactData = ABMultiValueCopyValueAtIndex(container, identifier);
CFRelease(container);
NSString *contactString = [NSString stringWithString:(NSString *)contactData];
CFRelease(contactData);

contactString enthält die ausgewählte Telefonnummer und personName enthält den Namen der Person. Wie oben erwähnt, können Sie den String nicht immer generisch in Zahlen umwandeln, da er alphanumerische Zeichen enthalten kann. Sie könnten jedoch einen eigenen Handler schreiben, um alphanumerische Zeichen in Zahlen umzuwandeln und alles andere zu entfernen, um nur einen numerischen String zu erhalten, den Sie dann in eine lange Zahl umwandeln könnten (Telefonnummern werden ziemlich lang).

Ich frage mich jedoch, ob es notwendig ist, eine Telefonnummer in einen numerischen Wert umzuwandeln, da sie auch andere notwendige Zeichen wie Pause enthalten kann. Außerdem stellt eine Telefonnummer eher eine Zeichenfolge von Ziffern dar als eine lange Zahl, sodass das konzeptionelle Datenformat ohnehin mehr String als Int ist.

0voto

nfriese Punkte 11

Bitte beachten Sie, dass dieser Code in "stringWithString" abstürzt, wenn der Adressbuch-Eintrag keinen Namen oder keine Kontaktdaten enthält. cfName könnte null sein!

CFStringRef cfName = ABRecordCopyCompositeName(person);
NSString *personName = [NSString stringWithString:(NSString *)cfName];
CFRelease(cfName); 

Fix:

NSString *personName = nil;
if ((cfName = ABRecordCopyCompositeName(person)) != nil) {
     personName = [NSString stringWithString:(NSString *)cfName];
     CFRelease(cfName); 
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X