iOS使用NSDictionary将数据加载到段和行中

我希望显示表格部分的date作为部分标题和行中的书名。 我都迷失在如何使用NSDictionary将数据加载到部分和行。 因此,我的代码都搞砸了:(任何人都可以提供一些帮助,一些示例代码作为指导?我的NSMutableArray如下:

( { BIBNo = 187882; date = "14/08/2012"; itemSequence = 000010; name = "Increasing confidence / Philippa Davies."; noOfRenewal = 0; number = 000187907; status = "Normal Loan"; time = "24:00"; type = Loans; }, { BIBNo = 291054; date = "14/08/2012"; itemSequence = 000010; name = "iPhone application development for IOS 4 / Duncan Campbell."; noOfRenewal = 2; number = 000291054; status = "Normal Loan"; time = "24:00"; type = Loans; }, { BIBNo = 244441; date = "15/08/2012"; itemSequence = 000010; name = "Coach : lessons on the game of life / Michael Lewis."; noOfRenewal = 1; number = 000244441; status = "Normal Loan"; time = "24:00"; type = Loans; }, { BIBNo = 290408; date = "15/08/2012"; itemSequence = 000010; name = "Sams teach yourself iPhone application development in 24 hours / John Ray."; noOfRenewal = 3; number = 000290408; status = "Normal Loan"; time = "24:00"; type = Loans; }, { BIBNo = 161816; date = "16/08/2012"; itemSequence = 000010; name = "Malaysian Q & As / compiled by Survey & Interview Department ; illustrations by Exodus."; noOfRenewal = 1; number = 000161817; status = "Normal Loan"; time = "24:00"; type = Loans; }, { BIBNo = 187883; date = "16/08/2012"; itemSequence = 000010; name = "Positive thinking / Susan Quilliam."; noOfRenewal = 3; number = 000187899; status = "Normal Loan"; time = "24:00"; type = Loans; } ) 

我如何实际重新添加到NSDictionary的对象,使具有相同date的对象将被存储在一起,以显示为行中的部分? 请给我一些build议,谢谢! T_T

要处理你的数据,你需要做类似的事情

 NSMutableDictionary *dataSource = [[NSMutableDictionary alloc] init]; // This would need to be an ivar for (NSDictionary *rawItem in rawItems) { NSString *date = [rawItem objectForKey:@"date"]; // Store in the dictionary using the data as the key NSMutableArray *section = [dataSource objectForKey:date]; // Grab the section that corresponds to the date if (!section) { // If there is no section then create one and add it to the dataSource section = [[NSMutableArray alloc] init]; [dataSource setObject:section forKey:date]; } [section addObject:rawItem]; // add your object } self.dataSource = dataSource; 

然后获得部分标题

 NSArray *sections =[[self.dataSource allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; return [sections objectAtIndexPath:indexPath.section]; 

然后在一节中获得一行

 NSString *sectionTitle = // get the section title calling the above code NSArray *items = [self.dataSource objectForKey:sectionTitle]; return [items objectAtIndex:indexPath.row]; 
  - Dictionary of sections by date | --- array of row objects for the date1 | | | --- row dictionary with the data to display | | | --- row dictionary with the data to display | | | --- row dictionary with the data to display | | | --- row dictionary with the data to display | | | --- array of row objects for the date2 | | | --- row dictionary with the data to display | | | --- row dictionary with the data to display | | | --- row dictionary with the data to display | | | | --- array of row objects for the date3 | --- row dictionary with the data to display | --- row dictionary with the data to display | --- row dictionary with the data to display | --- row dictionary with the data to display | --- row dictionary with the data to display 

总之,你不能重新添加对象到NSDictionary。 这是因为NSDictionary是不可变的。 一旦创build,它的内容不能被修改。 你想要的是一个NSMutableDictionary。

然后可以使用setObject:forKey:方法。

 [MyDict setObject:@"Normal Loan" forKey:@"status"]; 

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsmutabledictionary_Class/Reference/Reference.html

A-Live说,你将不得不把你的数组sorting到一个可变的字典数组

下面的代码应该可以工作,但是没有经过testing

在TableView控制器中.h

 @interface MyController:UITableViewController{ NSMutableArray* dict; NSMutableArray* array; } 

在MyController.m中

 -(void)initWithBooksArray:(NSArray*)bookArray{ //Or something similar self = [[super alloc] initWithStyle:UITableViewStylePlain]; if(self){ dict = [[NSMutableDictionary alloc] init]; array= [[NSMutableArray alloc] init]; NSMutableArray* sectionArray; for(NSDictionary* bookDict in bookArray){ date = [bookDict valueForKey:@"date"]; sectionArray = [dict valueForKey:date]; if(sectionArray){ [sectionArray addObject:bookDict]; }else{ sectionArray = [[NSMutableArray arrayWithObject:bookDict]; [dict addObject:sectionArray forKey:date]; } } array = [[dict allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; } return self; } -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ return [dict count]; } -(NSInterger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section{ NSString* key = [array objectAtIndex:section]; return [[dict objectForKey:key]count]; } - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{ return [array objectAtIndex:section]; } ... // I'll leave it to apple's documentation (or someone else) to fill in the blanks on how to create cells 

}