2012-12-05 146 views
0

我有一个项目列表显示在一个表视图。每个项目都有其名称,图片,排名等属性。 我的目标是,每当用户选择一行时,具有其属性的项目将被添加到新列表中。访问对象数组内的对象的属性

我创建了一个名为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.mreturn [_listOfBugs count];会给我未声明的标识符的“_listOfBugs”

2.我想abale来填充自定义列表表视图的错误使用,我该怎么办呢?

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

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

+0

难道你不能只是创建一个临时对象,它是你想要的对象的类型,并将该值设置为objectAtIndex:并使用它的属性? – CBredlow

+0

我不知道我跟着你,但想法是有一个音乐专辑列表,每张专辑都有一个歌曲列表,每首歌都有它的属性。用户将能够从任何专辑中选择歌曲来创建新的歌曲列表。 – Segev

+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); 
+0

出于某种原因,使用'newList'作为属性会给我错误'“语义问题:属性的合成getter遵循Cocoa命名约定来返回'拥有'对象。”'所以我从现在开始将它称为'listOfBugs' 。我把它变成了一个属性,但我仍然无法从另一个类访问它。例如在'listOfBugsViewController.m''return [_listOfBugs count];'会给我错误'Use of undeclared identifier'_listOfBugs'' – Segev

+0

我也不明白你说的意思是什么“你不需要你的iVar声明...即你可以删除NSMutableArray * listOfBugs;“我可以删除哪行代码? – Segev

+0

是的,对不起,它不能以新的开始,除非它创建一个新的对象并返回它。尝试使用'listOfBugs'而不是'_listOfBugs'。你可以删除的行是你的.h文件的第二行(不包括大括号)。 – lnafziger

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对象。这将需要对预期的对象进行类型化,以便您可以访问正确的属性。