2012-12-05 141 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對象。這將需要對預期的對象進行類型化,以便您可以訪問正確的屬性。