2009-10-20 79 views

回答

4

并不是所有的字符串常量都有它们周围的所有gubbins - 只是有人认为有人认为地址簿有这种情况。因此,我不认为有任何内置函数可以将它们删除。

这使得这个问题很简单:“我如何删除字符?”题。有这许多解决方案,但一个简单的一种是:

NSString *label = @"_$!<home>!$_"; 

NSString *rawLabel = [[label stringByReplacingOccurrencesOfString:@"_$!<" withString:@""] 
        stringByReplacingOccurrencesOfString:@">!$_" withString:@""]; 
+0

谢谢。我只是假设它将是所有常量的一个特征,而不是一个AB怪癖。 – RunLoop 2009-10-20 09:16:44

7

如果你显示在你的界面属性的名称,使用the ABCopyLocalizedPropertyOrLabel functionthe ABPersonCopyLocalizedPropertyName function,而不是试图从私人implementation-提取名常数的细节值。

如果你正在做这样的事情:

NSLog(@"%@: %@", kABURLsProperty, URLsValue); 

试试这个:

//In a header 
#define STRING_FROM_NAME(name) @#name 

//In the implementation 
NSLog(@"%@: %@", STRING_FROM_NAME(kABURLsProperty), URLsValue); 

这将打印不变,这是更为辨识的名称,而不是私人的常量的实现 - 细节值。 (注意,由于这是一个预处理器宏,它不会跟随变量,它只是从您作为第一个参数传递的任何文本中创建一个字符串;它不会尝试反向查找字符串。所以,如果你传递一个变量的名字,你会得到输出你的变量的名称)

-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"; 
+2

在iPhone上,改为尝试使用ABPersonCopyLocalizedPropertyName。 – 2009-10-20 22:27:27

+0

尼斯彼得,删除16行代码,是的! :) – catlan 2009-10-20 23:50:12

3

使用:

NSString *label = (NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(contact, index)); 
相关问题