2009-10-20 11 views
1

Lorsque j'imprime la valeur d'une constante CFString, par ex. une étiquette AddressBook dans la console, la valeur de sortie est _$!<home>!$_. Comment puis-je extraire uniquement la valeur pure, par exemple la maison? Toute aide serait grandement appréciée s'il vous plaît.Comment extraire une chaîne pure d'une chaîne constante

Répondre

4

Toutes les constantes de chaîne n'ont pas toutes ces gubbins autour d'elles - il arrive que quelqu'un décide que celles du carnet d'adresses le font. Par conséquent, je ne pense pas qu'il existe une fonction intégrée pour les supprimer.

Cela rend ce problème simple "Comment supprimer des caractères?" question. Il existe de nombreuses solutions à cela, mais simple est:

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

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

Merci. J'ai juste supposé que ce serait une caractéristique de toutes les constantes plutôt qu'une AB. – RunLoop

7

Si vous affichez le nom de la propriété dans votre interface, utilisez the ABCopyLocalizedPropertyOrLabel function ou the ABPersonCopyLocalizedPropertyName function au lieu de tenter d'extraire un nom du privé l'implémentation valeur de détail de la constante.

Si vous faites quelque chose comme ceci:

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

Essayez ceci:

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

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

Cela affichera le nom de la constante, ce qui est beaucoup plus reconnaissable, au lieu du privé valeur implémentation-détail de la constante. Notez que, puisqu'il s'agit d'une macro préprocesseur, elle ne suit pas les variables, elle crée simplement une chaîne à partir du premier argument que vous passez, elle ne cherche pas à inverser la recherche d'une chaîne. Donc, si vous passez un nom de variable, vous obtiendrez le nom de votre variable dans la sortie)

-2

Voici le code snipped J'utilise parce que ABCopyLocalizedPropertyOrLabel est Mac OS X uniquement au moment.

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

Sur l'iPhone, essayez plutôt ABPersonCopyLocalizedPropertyName. –

+0

Nice Peter, en supprimant 16 lignes de code, ouais! :) – catlan

3

Utilisation:

NSString *label = (NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(contact, index)); 
Questions connexes