0

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

我创建了一个名为的新列表listOfBugs,因为我希望它是全局的,所以我在里面分配并初始化了它viewDidLoad。(这样做合适吗?)

这是我的代码:

主视图控制器.h

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

主视图控制器.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从另一个班级访问。

我按照建议将它变成了一个属性,以使我的生活更轻松,但仍然无法从另一个班级访问它。例如 inlistOfBugsViewController.m return [_listOfBugs count];会给我错误 Use of undeclared identifier '_listOfBugs'

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

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

这是我基于的代码,我只做了一些调整来创建新列表

4

2 回答 2

2

这真的是两个问题:

1)如何使我的财产成为其他班级可以访问的公共财产?

你这样做就像你对你的bugs财产所做的那样。将此添加到您的 .h 文件中:

@property (strong) NSMutableArray *newList;

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

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

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

Objects in an array are stored as an id object, meaning that it is a "generic" object. If you know what type of object is stored, then you need to tell the compiler what it is so that it knows what properties and methods are appropriate for that class. You do this by casting the variable to the proper type:

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

Then, you can access the properties of the object, assuming that they are public (as covered in point 1 above) like this:

NSLog(@"this is %s", bug.data.tile);
于 2012-12-05T18:47:14.540 回答
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 对象。这需要转换为预期的对象,以便您可以访问正确的属性。

于 2012-12-05T16:58:19.253 回答