当我打印CFString常量的值时,例如控制台中的AddressBook标签,输出值为_$!<home>!$_
。我如何只提取纯值,例如家?非常感谢您的帮助。
答案 0 :(得分:7)
如果要在界面中显示属性的名称,请使用the ABCopyLocalizedPropertyOrLabel
function或the ABPersonCopyLocalizedPropertyName
function,而不是尝试从常量的私有实现详细信息值中提取名称。
如果您正在做这样的事情:
NSLog(@"%@: %@", kABURLsProperty, URLsValue);
请改为尝试:
//In a header
#define STRING_FROM_NAME(name) @#name
//In the implementation
NSLog(@"%@: %@", STRING_FROM_NAME(kABURLsProperty), URLsValue);
这将打印更常识别的常量名称,而不是常量的私有实现细节值。
(注意,由于这是一个预处理器宏,它不会跟随变量。它只是从您传递的任何文本中创建一个字符串作为第一个参数;它不会尝试反转 - 查找字符串。因此,如果传递变量名,您将在输出中获得变量的名称。)
答案 1 :(得分:4)
并非所有字符串常量都包含所有gubbins - 只是有人决定通讯录的那些。因此,我认为没有任何内置函数可以删除它们。
这使得这个问题变得简单“如何删除字符?”题。有很多解决方案,但一个简单的解决方案是:
NSString *label = @"_$!<home>!$_";
NSString *rawLabel = [[label stringByReplacingOccurrencesOfString:@"_$!<" withString:@""]
stringByReplacingOccurrencesOfString:@">!$_" withString:@""];
答案 2 :(得分:3)
使用:
NSString *label = (NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(contact, index));
答案 3 :(得分:-2)
这里是我使用的代码段,因为ABCopyLocalizedPropertyOrLabel
目前只是Mac OS X:
NSString *labelTranslation = @"";
if ([label isEqualToString:@"_$!<Home>!$_"])
labelTranslation = @"Home";
else if ([label isEqualToString:@"_$!<Mobile>!$_"])
labelTranslation = @"Mobile";
else if ([label isEqualToString:@"_$!<Work>!$_"])
labelTranslation = @"Work";
else if ([label isEqualToString:@"_$!<WorkFAX>!$_"])
labelTranslation = @"Work (Fax)";
else if ([label isEqualToString:@"_$!<Main>!$_"])
labelTranslation = @"Main";
else if ([label isEqualToString:@"_$!<HomeFAX>!$_"])
labelTranslation = @"Home (Fax)";
else if ([label isEqualToString:@"_$!<Pager>!$_"])
labelTranslation = @"Pager";
else if ([label isEqualToString:@"_$!<Other>!$_"])
labelTranslation = @"Other";