Доступ к NSMutableArray объектов, которые находятся в другом NSMutableArray (доступ к вложенным объектам IE) - PullRequest
0 голосов
/ 04 января 2012

У меня есть класс (USER), который имеет следующие свойства (имя NSString, адрес NSString, теги NSMutableArray). Свойство tags является NSMutableArray из (TAG) - TAG является классом, определенным как (NSNumber tagId, NSString tagName).

Я пробовал несколько разных способов доступа к 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);
}

В обоих примерах я получаю адрес памяти тега, но не значение tagName и 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);
}

Я никогда не попаду в цикл while в приведенном выше коде ...

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...

Ответы [ 4 ]

1 голос
/ 04 января 2012

В вашем классе Tag, tagID и tagName должны быть определены как свойства. Итак, в заголовочном файле класса для тега:

@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";
}
1 голос
/ 04 января 2012

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

[(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 с пользовательскими объектами, все что вам нужно сделать, это сообщить компилятору, какой тип объекта . Тогда все будет работать так, как вы ожидаете.

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

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];
}
1 голос
/ 04 января 2012
Tag *tag = [[Tag alloc] init];
for(NSInteger n = 0; n < [thisSpotTag count]; n++)
{
   tag = (Tag*)[thisSpotTag objectAtIndex:n]
    NSLog(@"Tagg Name:%@",tag.tagName);

}
1 голос
/ 04 января 2012

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

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

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

...