访问另一个 NSMutableArray 中的对象的 NSMutableArray(即嵌套对象访问)

Posted

技术标签:

【中文标题】访问另一个 NSMutableArray 中的对象的 NSMutableArray(即嵌套对象访问)【英文标题】:Access an NSMutableArray of objects which are in another NSMutableArray (I.E. Nested Object access) 【发布时间】:2012-01-04 04:06:22 【问题描述】:

我有一个类 (USER),它具有以下属性(NSString 名称、NSString 地址、NSMutableArray 标签)。 tags 属性是 (TAG) 的 NSMutableArray - 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 - 我正在使用带有 ARC 的 xCode 4.2。


在下面更新我的问题:

我回来了,并尝试了以下一些建议的修复方法,但我仍然无法从数组中获取数据。请记住,我有一个对象数组,其中每个对象都包含一个对象数组。

我有这个代码例如:

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 是 USER 对象的一部分的 TAG 对象。也许输入数组的样子有助于解释嵌套。

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;

对于Users 中的NSMutableArray,您需要像这样进行投射:

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

现在您可以简单地调用属性:

tag.tagId;
tag.tagName;

请记住,每当您将NSMutableArrayNSArray 与自定义对象一起使用时,您所需要做的就是告诉编译器该对象是什么类型。然后一切都会如您所愿。

这是您的案例的示例,从 NSMutableArray *usersArray 开始,Users:

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];

【讨论】:

很好,经过初步测试,这段代码似乎可以工作!我会在我抓到一些zzzz之后投入生产。感谢大家的快速响应! 彭 - 再次感谢为我的问题提供的建议解决方案,但它不起作用。我已经更新了我原来的问题,以显示对象是如何嵌套在数组中的。您修复的工作深度为 1 级,但不是 2 级。 @CocoaNoob 你只需要投两次;见我上面的修改。 彭。我已经实施了你的建议,它就像一个魅力。再次感谢您的所有帮助!【参考方案2】:

您正在获取类标签的对象,您需要获取该对象并访问它的属性。

Tag *tag;
NSString *tname;
while((tag = [enumerator nextObject]))

    tname = tag.tagName
    NSLog(@"%@", tname);

此代码假设您已声明适当的@property

【讨论】:

【参考方案3】:
Tag *tag = [[Tag alloc] init];
for(NSInteger n = 0; n < [thisSpotTag count]; n++)

   tag = (Tag*)[thisSpotTag objectAtIndex:n]
    NSLog(@"Tagg Name:%@",tag.tagName);


【讨论】:

【参考方案4】:

在您的 Tag 类中,tagID 和 tagName 应定义为属性。所以在Tag的类头文件中:

@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";

现在,如果您的对象存储在数组中,您可以使用快速枚举遍历数组并读取或写入每个标签。例如,假设您在名为 'arrayOfTags' 的数组中有一个 Tag 对象数组:

for(Tag *tag in arrayOfTags) 
    tag.tagName = @"some string";

【讨论】:

以上是关于访问另一个 NSMutableArray 中的对象的 NSMutableArray(即嵌套对象访问)的主要内容,如果未能解决你的问题,请参考以下文章

将 nsmutablearray 复制到另一个视图控制器中的另一个 nsmutablearray 在数组中显示空值

访问 NSMutableArray 对象以在 TableView 上使用

如何将 NSMutableArray 的内容复制到 iPhone 应用程序中的另一个 NStArray?

在另一个类的应用程序委托中使用 NSMutableArray

访问 nsmutablearray xcode 中的图像

如何获取 NSMutableArray 特定对象