访问另一个 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;
对于User
s 中的NSMutableArray
,您需要像这样进行投射:
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];
【讨论】:
很好,经过初步测试,这段代码似乎可以工作!我会在我抓到一些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?