2012-01-04 2 views
0

У меня есть класс (USER), который имеет следующие свойства (имя NSString, адрес NSString, теги NSMutableArray). Свойством тегов является NSMutableArray (TAG) - TAG - это класс, определенный как (NSNumber tagId, NSString tagName).Доступ к NSMutableArray объектов, которые находятся в другом NSMutableArray (доступ к вложенным объектам I.E.)

Я пробовал несколько различных способов доступа к tagName и tagId, однако они не увенчались успехом.

Пример кода 1 ниже:

Tag *tag = [[Tag alloc] init]; 
for(NSInteger n = 0; n < [thisSpotTag count]; n++) 
{ 
    NSLog(@"%@", [thisSpotTag objectAtIndex:n]); 
} 

Пример кода 2 ниже:

NSEnumerator *enumerator = [thisSpotTag objectEnumerator]; 
NSString *tname = nil; 
while((tname = [enumerator nextObject])) 
{ 
    NSLog(@"%@", tname); 
} 

В обоих примерах, я получить адрес памяти тега, но не значение тэга и TagID ,

Как мне получить доступ к этой информации?

PS - Я использую xCode 4.2 с ARC.


Обновление на мой вопрос ниже:

Я вернулся, и попробовал несколько из предложенных исправлений ниже, однако я до сих пор не может получить данные из массива. Помните, у меня есть массив объектов, в которых каждый объект содержит массив объектов.

У меня есть этот код, например:

NSEnumerator *enumerator = [thisUser.tags objectEnumerator]; 
Tag *tagObj = [[Tag alloc] init];  
while(tagObj = [enumerator nextObject]) 
{ 
    NSLog(@"enumerated tag id:%@ name:%@", tagObj.tid, tagObj.name); 
} 

Я никогда не сделать его в петлю, а в коде выше ...

thisUser.tag является объектом TAG для части объекта USER , Возможно, написание того, как выглядит массив, поможет объяснить вложенность.

NSMutableArray(    "this is an NSMutableArray of USER objects" 
    element 0 => USER Object 1 
     USER.name is an NSString 
     USER.address is an NSString 
     USER.tag    "this is an NSMutableArray of TAG objects" 
      element 0 => TAG Object 1 
       TAG.tagId is an NSNumber 
       TAG.tagName is an NSString 
      element 1 => TAG Object 2 
       ...etc... 
    element 1 => USER Object 2 
     ...etc... 

ответ

1

Попробуйте литья затем доступа к свойствам:

[(Tag *)[array objectAtIndex:i] tagId]; 
[(Tag *)[array objectAtIndex:i] tagName]; 

Или, для быстрого перечисления (лучше), не

(Tag *)tag = [enumerator nextObject]; 
tag.tagId; 
tag.tagName; 

Для NSMutableArray от User s, вам нужно бросить так:

User *user = (User *)[array objectAtIndex:i]; 
Tag *tag = (Tag *)[user.tags objectAtIndex:j]; 

Теперь вы можете просто вызвать свойство:

tag.tagId; 
tag.tagName; 

Помните, что всякий раз, когда вы используете NSMutableArray или NSArray с пользовательскими объектами, все, что вам нужно сделать is to сообщить компилятору, какой тип объекта. Тогда все будет работать так, как вы ожидаете.

Вот пример для случая, начиная с NSMutableArray *usersArray из User с:

for (int i=0; i<usersArray.count; ++i) { 
    User *user = (User *)[usersArray objectAtIndex:i]; 
    NSLog(@"Name: %@\n",user.name); 
    NSLog(@"Address: %@\n",user.address); 
    NSLog(@"Tags: \n"); 
    for (int j=0; j<[user.tags count]; ++j) { 
     NSLog(@"ID: %@", (Tag *)[[user.tags objectAtIndex:j] tagID]); 
     NSLog(@"Name: %@", (Tag *)[[user.tags objectAtIndex:j] tagName]); 
    } 
    [user release]; 
} 
+0

Отлично, после первоначального тестирования этот код работает! Я введу в производство после того, как поймаю некоторые zzzz. Спасибо за быстрый ответ всем! – ElasticThoughts

+0

Peng - еще раз спасибо за предлагаемое решение моей проблемы, однако его не работает. Я обновил свой оригинальный вопрос, чтобы показать, как объекты вложены в массивы. Вы исправляете работу, идущую на 1 уровень глубиной, но не на 2 уровня. – ElasticThoughts

+0

@CocoaNoob Вам просто нужно бросить дважды; см. мои изменения выше. – PengOne

1

Вы получаете объект класса Tag, вам необходимо взять объект и получить доступ к его собственности.

Tag *tag; 
NSString *tname; 
while((tag = [enumerator nextObject])) 
{ 
    tname = tag.tagName 
    NSLog(@"%@", tname); 
} 

Этот код при условии, что у вас есть объявить соответствующий @property

1
Tag *tag = [[Tag alloc] init]; 
for(NSInteger n = 0; n < [thisSpotTag count]; n++) 
{ 
    tag = (Tag*)[thisSpotTag objectAtIndex:n] 
    NSLog(@"Tagg Name:%@",tag.tagName); 

} 
1

В классе тегов, то TagID и тэгу должны быть определены как свойства. Таким образом, в файле заголовка класса для тега:

@property (nonatomic, strong) NSNumber *tagID; 
@property (nonatomic, strong) NSString *tagName; 

и в осуществлении синтеза свойства:

@synthesize tagID = _tagID; 
@synthesize tageName = _tagName; 

Затем, когда у вас есть объект тегов вы можете получить доступ к переменным экземпляра, с помощью точечной нотации. Например:

Tag *exampleTag = [[Tag alloc] init]; 
exampleTag.tagName = @"Some name for your tag"; 

Теперь, если ваши объекты хранятся в массиве вы можете перебирать массив и чтение или запись каждого тега, используя быстрое перечисление. Например, если у вас есть массив объектов Tag в массиве под названием «arrayOfTags»:

for(Tag *tag in arrayOfTags) { 
    tag.tagName = @"some string"; 
} 
Смежные вопросы