2010-06-23 2 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:@", "]; 
    }  
} 

адрес является NSArray, который содержит адресОбъект NSArrayAtIndex не работает. Пожалуйста, помогите

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; 
    } 
) 

Я пытаюсь пройти через массив и создать строку CSV, так что это будет выглядеть как

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

Однако, Я продолжаю сбой на

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

Сообщение Я получаю

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

ОБНОВЛЕНО: detailItem является объектом типа ABContact (пользовательский класс).

ABContact имеет свойство addressArray

 
@property (nonatomic, readonly) NSArray *addressArray; 

определение моей addressArray является

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

сообщения об ошибке самоописательное - адрес объект не является массив - это словарь и вам сек он будет обрабатывать его соответствующим образом. – Vladimir

+0

Как насчет того, чтобы мой класс возвращал NSArray из класса ABContact? –

ответ

3

Ваш "адрес" является NSArray из NSDictionary, не NSArray из NSArray.

Чтобы получить значение словаря как массив, вы можете использовать

[theDictionary allValues] 

но нет нет гарантии на заказе. И я думаю, что вы на самом деле нужно:

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

+1 это гораздо правильнее, чем ответ @ huntaub –

+0

Единственная проблема в том, что модель, в которой я проходил (detailItem), не всегда имеет все те же свойства. Некоторые адреса не имеют города, состояния Некоторые адреса имеют почтовый индекс и состояние Так как я могу определить (программно), что включать. Использование NSMutableString не поддерживается Google. http://maps.google.com/maps/geo?q =% @ & output = csv –

+0

@ orangecl4now 'NSMutableString' * - это' NSString', и где угодно вы можете использовать 'NSString', вы можете использовать' NSMutableString' –

1

В этом:

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; 
} 
) 

Является NSDictionary. Вы хотите получить доступ к своим членам с [dictionary objectForKey:'City']

Итак, ваш обновленный код следует читать:

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

Единственная проблема заключается в том, что словарь 'objectEnumerator' не обязательно возвращает вещи в любом порядке, поскольку сам словарь не поддерживает порядок. Кроме того, вы должны использовать синтаксис 'for..in'. Это проще. Кроме того, вы никогда не увеличивали счетчик. Я редактировал код для вас. :) Также как в стороне, это собирается создать * много * дополнительных автореализованных объектов. Вместо этого я использовал бы «NSMutableString». –

+0

Спасибо! Я забыл добавить счетчик приращений ... :) Я знал о проблемах с заказами и автореализованными объектами, но я хотел как можно ближе подойти к исходному коду OP. – huntaub

+0

huntaub: Нет, 'address' является экземпляром NSArray (описывается как' (...) '). Его единственный элемент (описываемый как '{...}') является NSDictionary. –

0

Если бы вы могли изменить метод addressArray на самом деле возвращает массив вместо словаря, то вы можете сделать:

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

и вот это ...

Смежные вопросы