2010-06-23 7 views
0
NSArray* address = [NSArray arrayWithArray:[detailItem addressArray]]; 
NSLog(@"address = %@", address); 
NSString* addressToString = @""; 
int arrayCount = [address count]; 
for (int i = 0; i < arrayCount; i++) { 
    addressToString = [addressToString stringByAppendingString:[address objectAtIndex:i]]; 
    if (i == arrayCount -1) { 
     addressToString = [addressToString stringByAppendingString:@""]; 
    } else { 
     addressToString = [addressToString stringByAppendingString:@", "]; 
    }  
} 

adresse est une NSArray qui détient une adresseNSArray objectAtIndex ne fonctionne pas. S'il vous plaît aider

2010-06-23 09:05:19.346 iPhoneExample[1093:207] address = (
     { 
     City = "Cupertino"; 
     Country = "United States"; 
     CountryCode = us; 
     State = CA; 
     Street = "1 Infinite Loop"; 
     ZIP = 95014; 
    } 
) 

Je suis en train de passer par le tableau et de créer une chaîne CSV il ressemblerait

Cupertino, "United States", us, CA, "1 Infinite Loop", 95014 

Cependant, Je continue de plantage

addressToString = [addressToString stringByAppendingString:@", "]; 

Le message que je reçois est

 
*** -[NSCFDictionary stringByAppendingString:]: unrecognized selector sent to instance 0x1c2f10 

MISE À JOUR: detailItem est un objet de type ABContact (classe personnalisée).

ABContact possède une propriété appelée addressArray

 
@property (nonatomic, readonly) NSArray *addressArray; 

la définition de mon addressArray est

 
- (NSArray *) addressArray {return [self arrayForProperty:kABPersonAddressProperty];} 
+1

message d'erreur est auto-descriptif - objet adresse est pas un tableau - il est un dictionnaire et vous s hould le traiter en conséquence. – Vladimir

+0

Que diriez-vous que ma classe retourne un NSArray de la classe ABContact? –

Répondre

3

Votre "adresse" est un NSArray de NSDictionary, pas un NSArray de NSArray.

Pour obtenir les valeurs du dictionnaire comme un tableau, vous pouvez utiliser

[theDictionary allValues] 

mais il n'y a pas garantie de l'ordre. Et je pense que ce que vous avez réellement besoin est:

NSMutableString* addressToString = [NSMutableString string]; // use mutable string! 
for (NSDictionary* item in address) {  // use fast enumeration! 
    [addressToString appendFormat:@"%@, \"%@\", %@, %@, \"%@\", %@\n", 
    [item objectForKey:@"City"], 
    /* etc ... */ 
    ]; 
} 
+0

+1 c'est beaucoup plus correct que la réponse de @ huntaub –

+0

Le seul problème est que le modèle dans lequel je passe (detailItem) n'a pas toujours les mêmes propriétés. Certaines adresses n'ont pas de ville, état Certaines adresses ont un code postal et l'état Alors, comment puis-je déterminer (par programme) ce qu'il faut inclure. L'utilisation d'un NSMutableString n'est pas appréciée par Google. http://maps.google.com/maps/geo?q =% @ & output = csv –

+0

@ orangecl4now un NSMutableString est un NSString, et partout où vous pouvez utiliser un NSString, vous pouvez utiliser un NSMutableString –

1

Ce:

2010-06-23 09:05:19.346 iPhoneExample[1093:207] address = (
    { 
    City = "Cupertino"; 
    Country = "United States"; 
    CountryCode = us; 
    State = CA; 
    Street = "1 Infinite Loop"; 
    ZIP = 95014; 
} 
) 

Est-ce un NSDictionary. Vous voulez accéder à ses membres [dictionary objectForKey:'City']

Ainsi, votre code mis à jour devrait lire:

NSDictionary* address = [detailItem addressArray]; 
NSLog(@"address = %@", address); 
NSString* addressToString = @""; 
int counter = 0; 
for (id object in myDictionary) { 
    if (counter != 0) 
    addressToString = [addressToString stringByAppendingString:@","]; 
    addressToString = [addressToString stringByAppendingString:object]; 
    counter++; 
} 
+0

Le seul problème avec ceci est que le dictionnaire 'objectEnumerator' ne renvoie pas nécessairement les choses dans n'importe quel ordre, car un dictionnaire lui-même ne maintient pas l'ordre. De plus, vous devriez utiliser la syntaxe 'for..in'. C'est plus simple. De plus, vous n'avez jamais incrémenté 'counter'. J'ai modifié le code pour vous. :) Aussi, en aparté, cela va créer un * lot * d'objets supplémentaires auto-libérés. J'utiliserais un NSMutableString à la place. –

+0

Merci! J'ai oublié d'ajouter l'incrément de compteur ... :) Je connaissais les problèmes de commande et d'auto-libération des objets, mais je voulais rester aussi proche que possible du code original de l'OP. – huntaub

+0

huntaub: Non, 'address' est une instance de NSArray (décrite comme' (...) '). Son seul élément (décrit comme '{...}') est un NSDictionary. –

0

Si vous pouviez changer votre méthode addressArray pour revenir en fait un tableau au lieu d'un dictionnaire, vous pouvez alors faire:

NSString * addressString = [[detailItem addressArray] componentsJoinedByString:@","]; 

et que c'est ...

Questions connexes