我知道NSString
和CFString
是收费网桥,他们可以通过这种方式进行转换。
CFStringRef cfStr;
NSString* anStr=(NSString*)cfStr;
然而,当我在处理地址簿时转换字符串
NSString* homeLabel=(NSString*)kABWorkLabel;
然后homeLabel是{{1}};
地址簿属性中的另一个预定义"_$!<Work>!$_"
是相同的。
在我的程序中,我想获得标签和标签项的信息。
CFStringRef
那么如何正确获取标签的字符串?
答案 0 :(得分:22)
尝试使用ABAddressBookCopyLocalizedLabel?
类似的东西:
ABAddressBookRef ab = ABAddressBookCreate();
ABRecordID personID = <someid>;
CFIndex phoneNumberIndex = <anIndexFromSomewhere>;
ABRecordRef person = ABAddressBookGetPersonWithRecordID(ab, personID);
CFStringRef name = ABRecordCopyCompositeName(person);
ABMultiValueRef phoneNumbers = ABRecordCopyValue(person, kABPersonPhoneProperty);
CFStringRef number = ABMultiValueCopyValueAtIndex(phoneNumbers, phoneNumberIndex);
CFStringRef label = ABMultiValueCopyLabelAtIndex(phoneNumbers, phoneNumberIndex);
CFStringRef localizedLabel = ABAddressBookCopyLocalizedLabel(label);
NSLog(@"Person: %@", name);
NSLog(@"%@ : %@", localizedLabel, number);
CFRelease(label);
CFRelease(localizedLabel);
CFRelease(number);
CFRelease(phoneNumbers);
CFRelease(name);
CFRelease(ab);
答案 1 :(得分:6)
试试这个:
+ (NSString *) displayPropertyName:(NSString *) propConst{
if ([propConst isEqualToString:@"_$!<Anniversary>!$_"]) return @"anniversary";
if ([propConst isEqualToString:@"_$!<Assistant>!$_"]) return @"assistant";
if ([propConst isEqualToString:@"_$!<AssistantPhone>!$_"]) return @"assistant";
if ([propConst isEqualToString:@"_$!<Brother>!$_"]) return @"brother";
if ([propConst isEqualToString:@"_$!<Car>!$_"]) return @"car";
if ([propConst isEqualToString:@"_$!<Child>!$_"]) return @"child";
if ([propConst isEqualToString:@"_$!<CompanyMain>!$_"]) return @"company main";
if ([propConst isEqualToString:@"_$!<Father>!$_"]) return @"father";
if ([propConst isEqualToString:@"_$!<Friend>!$_"]) return @"friend";
if ([propConst isEqualToString:@"_$!<Home>!$_"]) return @"home";
if ([propConst isEqualToString:@"_$!<HomeFAX>!$_"]) return @"home fax";
if ([propConst isEqualToString:@"_$!<HomePage>!$_"]) return @"home page";
if ([propConst isEqualToString:@"_$!<Main>!$_"]) return @"main";
if ([propConst isEqualToString:@"_$!<Manager>!$_"]) return @"manager";
if ([propConst isEqualToString:@"_$!<Mobile>!$_"]) return @"mobile";
if ([propConst isEqualToString:@"_$!<Mother>!$_"]) return @"mother";
if ([propConst isEqualToString:@"_$!<Other>!$_"]) return @"other";
if ([propConst isEqualToString:@"_$!<Pager>!$_"]) return @"pager";
if ([propConst isEqualToString:@"_$!<Parent>!$_"]) return @"parent";
if ([propConst isEqualToString:@"_$!<Partner>!$_"]) return @"partner";
if ([propConst isEqualToString:@"_$!<Radio>!$_"]) return @"radio";
if ([propConst isEqualToString:@"_$!<Sister>!$_"]) return @"sister";
if ([propConst isEqualToString:@"_$!<Spouse>!$_"]) return @"spouse";
if ([propConst isEqualToString:@"_$!<Work>!$_"]) return @"work";
if ([propConst isEqualToString:@"_$!<WorkFAX>!$_"]) return @"work fax";
return @"";
}
答案 2 :(得分:0)
您必须检测带有后缀和前缀的标签。然后做一个子串来获取标签。
您获得的值是地址簿数据库中字符串的正确标签。在向用户呈现之前,他们只是稍微打磨了一下。就是这样。
答案 3 :(得分:0)
在较新的Contacts框架中,您有一个类函数
以下是快速4中的示例
let emailValue: CNLabeledValue<NSString> = ...
let label = emailValue.label ?? ""
let prettyLabel = type(of: emailValue).localizedString(forLabel: label)
这会将"_$!<Work>!$_"
更改为"work"
更好的是,您可以进行扩展
extension CNLabeledValue {
@objc func prettyLabel() -> String? {
if let label = label {
return type(of: self).localizedString(forLabel: label)
}
return nil
}
}
现在您的通话更加简单
let emailValue: CNLabeledValue<NSString> = ...
let prettyLabel = emailValue.prettyLabel()