我有一个显示在表格视图上的项目列表。 每个项目都有其名称,图片,等级等属性。 我的目标是,每当用户选择一行时,具有其属性的项目将被添加到新列表中。
我创建了一个名为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
答案 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对象。这需要对预期对象进行类型转换,以便您可以访问正确的属性。