2009-10-20 72 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)); 
相關問題