访问对象数组内对象的属性

时间:2012-12-05 16:15:54

标签: ios arrays

我有一个显示在表格视图上的项目列表。 每个项目都有其名称,图片,等级等属性。 我的目标是,每当用户选择一行时,具有其属性的项目将被添加到新列表中。

我创建了一个名为listOfBugs的新列表,因为我希望它是全局的,我已在viewDidLoad内分配并初始化它。 (这是正确的事吗?)

这是我的代码:

MasterViewController.h

@interface MasterViewController : UITableViewController
{
    NSMutableArray *listOfBugs;
}
@property (strong) NSMutableArray *bugs;

MasterViewController.m

- (void)viewDidLoad
{
    [super viewDidLoad];
    listOfBugs = [[NSMutableArray alloc]init];
    self.title = @"Scary Bugs";
}
...
...
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    ScaryBugDoc *bug = [self.bugs objectAtIndex:indexPath.row];

    UIAlertView *messageAlert = [[UIAlertView alloc]
                                 initWithTitle:@"Row Selected" message:bug.data.title delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];

    [messageAlert show];
    [listOfBugs addObject:bug];
    NSLog(@"this is %@",listOfBugs);

}

使用NSLog我可以看到添加了对象:

ScaryBugs[1195:11303] this is <ScaryBugDoc: 0x75546e0>
2012-12-05 17:45:13.100 
ScaryBugs[1195:11303] this is <ScaryBugDoc: 0x75546e0>

我有几个问题。

1.如何访问数组listOfBugs中对象的属性?

更新:这对我有用:

NSLog(@"this is %@",((ScaryBugDoc *)[listOfBugs objectAtIndex:0]).data.title);

但我无法从另一个班级访问listOfBugs

我把它变成了一个建议的属性,以使我的生活更轻松,但仍然无法从另一个类访问它。 例如,listOfBugsViewController.m return [_listOfBugs count];会给我错误使用未声明的标识符'_listOfBugs'

2.我想用自定义列表填充表格视图,我该怎么做?

在完成之后我想将列表保存为plist并且还可以轻松地添加和删除对象,因此我需要考虑这一点。

This is the code that I'm based on, I only made a few adjustments to create the new list

2 个答案:

答案 0 :(得分:2)

这实际上是两个问题:

1)如何将我的属性设为可以被其他类访问的公共属性?

您就像使用bugs财产一样。将其添加到.h文件中:

@property (strong) NSMutableArray *newList;

请注意,如果您不使用不同的线程,则可以使用nonatomic属性(@property (nonatomic, strong))来提高效率。

一旦这样做,您就不需要iVar声明,因为它会自动为您生成。 (即您可以删除NSMutableArray *newList;。)

2)如何访问数组中的对象?

数组中的对象存储为id对象,这意味着它是一个“通用”对象。如果您知道存储了什么类型的对象,那么您需要告诉编译器它是什么,以便它知道适合该类的属性和方法。您可以通过变量转换为正确的类型来执行此操作:

ScaryBugDoc *bug = (ScaryBugDoc *)[self.newList objectAtIndex:0];

然后,您可以访问该对象的属性,假设它们是公共的(如上面第1点所述),如下所示:

NSLog(@"this is %s", bug.data.tile);

答案 1 :(得分:0)

好的,基于评论,这应该有效:

Album* tempAlbum = [albumList objectAtIndex:i];
//now you can access album's properties
Song* tempSong = [album.songs objectAtIndex:j];
//now you can access song's properties

这可以简化为:

Song* someSong = [((Album)[albumList objectAtIndex:i]).songs objectAtIndex:j];

从NSArray或类似的集合对象返回对象时,它将返回一个通用id对象。这需要对预期对象进行类型转换,以便您可以访问正确的属性。