【问题标题】:How to programmatically get address placeholder text from iphone addressbook?如何以编程方式从 iphone 通讯录中获取地址占位符文本?
【发布时间】:2013-06-19 00:33:52
【问题描述】:

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

例如-

United States 占位符是: 街道、城市、ZIP

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

我还必须确保占位符映射到代码中的正确字段(即“县”映射到州,“邮政编码”映射到 zip)。我目前的做法非常繁琐:遍历并选择联系人中的每个国家并手动复制文本,然后确保字段映射正确。

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

【问题讨论】:

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


    【解决方案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文件中找到了'Localization native development region'。如果你改变它,翻译就会改变。以用户语言显示标签。

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

    所以,我希望这能帮助你喜欢我的正确答案:)

    吉米

    【讨论】:

    • 是的,我认为这满足了我的需求。所以,我不太精通地址簿的使用。 multiValue 变量中有什么?是数组还是字典?基本上,我需要告诉它使用特定的国家代码,然后获取所有其他字段的标签。我该怎么做?
    • 我很高兴能尝试一下,b/c 我以为就是这样,但唉,这并不是我所需要的。带有键的代码的最后一部分: %@ -> %@ 确实是我正在寻找的核心,但它并没有提供我希望的东西。这是我的一位联系人的示例。 Country Code = US... 在此实例中的“键”是“Street”“City”“State”“ZIP”“Country”,都具有预期的“值”。示例 2(另一个联系人):国家代码 =“GB”(英国)。键是相同的“街道”“城市”“州”“ZIP”“国家”。我的下一条评论将描述我希望得到什么。
    • 我希望为英国获得以下信息:“街道”“城市”“县”“邮政编码”“国家”。注意文本中细微但重要的区别(在地址簿中的实际联系人中,这是 UITextField 的占位符文本)。
    • 一旦我弄清楚如何获取这些项目(占位符文本),然后我应该能够通过更改手机“语言”的设置来获得“本地化”版本(设置>常规>国际> 语言)。但是,如果还有更好的编程方式来获取该信息,那将比一遍又一遍地更改设置要快得多。
    • 最后一件事...非常感谢您的帮助。我非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多