如何以编程方式从iphone地址簿获取地址占位符文本?

时间:2011-08-30 17:52:52

标签: iphone objective-c placeholder abaddressbook street-address

我试图为用户提供一种在基于位置的应用程序中输入地址的方法,我希望它看起来与iPhone联系人/地址簿中的地址完全相同。这意味着我需要根据所选国家/地区更新每个字段的占位符文本。

例如 -

美国占位符是: 街道,城市, ZIP

英国占位符是: 街道,城市,邮政编码

我还必须确保占位符映射到代码中的正确字段(即“County”映射到state并且“Post Code”映射到zip)。我目前的方法非常麻烦:通过并选择联系人中的每个国家/地区并手动复制文本,然后确保字段正确映射。

是否有任何编程方式可以做到这一点?即使是通过私有API调用,我只需要执行一次以获取信息,然后我可以删除代码。我在Apple的文档中找不到提供此类信息的任何信息(ABAddressBook文档)。

1 个答案:

答案 0 :(得分:1)

不确定,如果我找对你。您需要每个字段的区域设置名称 - 例如语言环境翻译,法语,德语等?

通常,地址字段不多 - 请参阅:ABPerson.h头文件:

// Addresses
extern const ABPropertyID kABPersonAddressProperty;            // Street address - kABMultiDictionaryPropertyType
extern const CFStringRef kABPersonAddressStreetKey;
extern const CFStringRef kABPersonAddressCityKey;
extern const CFStringRef kABPersonAddressStateKey;
extern const CFStringRef kABPersonAddressZIPKey;
extern const CFStringRef kABPersonAddressCountryKey;
extern const CFStringRef kABPersonAddressCountryCodeKey;

如果您需要字段名称(因为可能存在个人幻想名称;)),请务必使用ABAddressBookCopyLocalizedLabel,如下所示:

CFStringRef label = ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(multiValue, j));

如果我弄错了,也许你想澄清一下你的问题。

修改

好吧,我仍然不确定我是否帮助你,但我会回答'两种'我找到你的方式;)

首先,您需要通用字段名称(区域设置无关) - 您可以通过以下方式获取(在项目的当前区域设置中):代码使用NSArrays和NSDictionaries,具体取决于地址簿卡的条目:

- (void) logAddressBook {

    ABAddressBookRef addressBook = ABAddressBookCreate();

    NSArray *addresses = (NSArray *) ABAddressBookCopyArrayOfAllPeople(addressBook);

    int i;
    for(i = 0; i < [addresses count]; i++) {
        ABRecordRef record = [addresses objectAtIndex:i];
        NSString *firstName = (NSString *)ABRecordCopyValue(record, kABPersonFirstNameProperty);
        NSString *lastName = (NSString *)ABRecordCopyValue(record, kABPersonLastNameProperty);

        NSLog(@"%@, %@", lastName, firstName);

        ABMultiValueRef multiValue = ABRecordCopyValue(record, kABPersonEmailProperty);

        int count = ABMultiValueGetCount(multiValue);
        int j;
        for(j = 0; j < count; j++) {
            CFStringRef label = ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(multiValue, j));
            NSString *value = (NSString *)ABMultiValueCopyValueAtIndex(multiValue, j);

            NSLog(@"Email for %@: %@", label, value);

            CFRelease(label);
        }

        //Get the contact´s addresses
        CFTypeRef adressesReference = ABRecordCopyValue((ABRecordRef)record, kABPersonAddressProperty);    

        CFIndex mvCount = ABMultiValueGetCount(adressesReference);
        if (mvCount > 0) {
            NSLog(@"Addresses: ");    
            for (j=0; j < mvCount; j++) {
                CFStringRef key = ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(adressesReference, j));
                NSDictionary *values = (NSDictionary *)ABMultiValueCopyValueAtIndex(adressesReference, j);

                NSLog(@"%@ - ", key);
                NSEnumerator *enumerator = [values keyEnumerator];
                id innerKey;

                while ((innerKey = [enumerator nextObject])) {
                    /* code that uses the returned key */
                    NSString *value = (NSString *)[values objectForKey: innerKey];
                    CFStringRef innerKeyLabel = ABAddressBookCopyLocalizedLabel((CFStringRef)innerKey);
                    NSLog(@"key: %@ -> value: %@", innerKeyLabel, value);
                }    

            }             
        }

        CFRelease(adressesReference);

    }

}

查看日志,您会看到如何获取您喜欢的所有标签和值 - 只需将代码扩展到您想要的字段。

我的回答的另一部分:我想知道你是否只想看到用户可能拥有的不同语言的标签作为区域设置。如法语,德语等。如果你想看到这个(让ABAddressBookCopyLocalizedLabel使用不同的语言)我只在项目的.plist文件中找到了“本地化本机开发区域”。如果更改此设置,则会更改翻译。以用户语言显示标签。

我不确定是否可以通过编程方式更改此内容。如果你知道一种方法,请告诉我;)

所以,我希望这有助于你喜欢我更正的答案:)