访问 NSMutableArray 对象以在 TableView 上使用
Posted
技术标签:
【中文标题】访问 NSMutableArray 对象以在 TableView 上使用【英文标题】:Accessing NSMutableArray Objects For Using On TableView 【发布时间】:2013-03-22 13:38:43 【问题描述】:我开始开发一个应用程序,它使用带有 JSON 数据的 WCF 服务。我从 WCF 服务中获取了数据,但我没有按照自己的意愿使用它。
这是 JSON 数据:
"MenuDoldurandroidResult":[
"menu_description":"Turkish Pizza","menu_title":"L Pizza","menu_price":"26 TL","menu_description":"Italiano Pizza","menu_title":"L Pizza","menu_price":"27 TL","menu_description":"Extravaganza","menu_title":"L Pizza","menu_price":"29 TL","menu_description":"Pepporoni Pizza","menu_title":"L Pizza","menu_price":"28 TL","menu_description":"Turkish Pizza","menu_title":"S Pizza","menu_price":"12 TL","menu_description":"Italiano Pizza","menu_title":"S Pizza","menu_price":"13 TL","menu_description":"Extravaganza","menu_title":"S Pizza","menu_price":"15 TL","menu_description":"Pepporoni Pizza","menu_title":"S Pizza","menu_price":"14 TL"
]
我想要什么:
如果这里有 2 个标题,那么表格视图中必须有 2 个部分。每个项目都必须在他们的部分中。
像这样:
-L 比萨饼
土耳其披萨 26 里拉 意大利披萨 27 里拉 Extravaganza Pizza 29 TL 意大利辣香肠披萨 28 TL-S 披萨
土耳其披萨 12 TL 意大利披萨 13 TL Extravaganza 披萨 15 里拉 意大利辣香肠披萨 14 TL我怎样才能访问这个项目并像这样显示?
- (void)viewDidLoad
[super viewDidLoad];
//I posted request to service here. I didn't write these parts of code.
NSDictionary* json = [NSJSONSerialization
JSONObjectWithData:data
options:NSJSONReadingMutableContainers
error:&error];
NSMutableArray *array= [json objectForKey:@"MenuDoldurAndroidResult"];
menu = [[NSMutableArray alloc] initWithCapacity:3];
NSString *descriptionTemp;
NSString *titleTemp;
NSString *priceTemp;
for(int i=0; i< array.count; i++)
NSDictionary *menuList= [array objectAtIndex:i];
titleTemp = [menuList objectForKey:@"menu_title"];
descriptionTemp = [menuList objectForKey:@"menu_description"];
priceTemp = [menuList objectForKey:@"menu_price"];
[menu addObject:[NSArray arrayWithObjects:titleTemp,descriptionTemp,priceTemp,nil]];
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return 2;
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
return 2;
-(NSString *)tableView:(UITableView*)tableView titleForHeaderInSection:(NSInteger)section
if (section==0)
return @"L Pizzas";
else
return @"S Pizzas";
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:nil];
cell.textLabel.text = [menu objectAtIndex: indexPath.row];
return cell;
【问题讨论】:
【参考方案1】:如果您的内容是静态的,您可以尝试使用 Sunny 的答案。但如果是动态的,最好以不同的方式存储数据。显然 L 披萨和 S 披萨似乎是一个类别,其余的就像类别项目。
您需要制作类别的集合。 Demo Project Source Code
- (void)viewDidLoad
[super viewDidLoad];
//I posted request to service here. I didn't write these parts of code.
NSDictionary* json = [NSJSONSerialization
JSONObjectWithData:data
options:NSJSONReadingMutableContainers
error:&error];
NSMutableArray *allPizzas = [json[@"MenuDoldurAndroidResult"] mutableCopy];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"menu_price"
ascending:YES
selector:@selector(compare:)];
[allPizzas sortUsingDescriptors:@[sortDescriptor]];
NSMutableArray *pizzaCategories = [@[]mutableCopy];
//Find unique categories in all the pizzas
NSSet* categories = [NSSet setWithArray: [allPizzas valueForKey:@"menu_title"]];
//Enumerate to form a new reformatted category array
for (NSString *categoryTitle in categories)
//Predicate is used to find the items that come under current category
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"menu_title == %@",categoryTitle];
NSArray *categoryItems = [allPizzas filteredArrayUsingPredicate:predicate];
//New dictionary with name of category and category items are formed
NSDictionary *categoryDict = @@"menu_title":categoryTitle,@"pizzas":categoryItems;
[pizzaCategories addObject:categoryDict];
//Assign the new formatted category array to the instance variable for holding categories.
self.categories = pizzaCategories;
修改tableView的datasource为新结构
#pragma mark - UITableViewDataSource
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
//The count of categories will give number of sections
NSUInteger sections = [self.categories count];
return sections;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
//The number of items in a category is calculated
NSDictionary *category = self.categories[section];
return [category[@"pizzas"] count];
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
//Title for the category
NSDictionary *category = self.categories[section];
return category[@"menu_title"];
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *cellIdentifier = @"CellIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (!cell)
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
NSDictionary *category = self.categories[indexPath.section];
NSArray *categoryItems = category[@"pizzas"];
NSDictionary *categoryItem = categoryItems[indexPath.row];
cell.textLabel.text = categoryItem[@"menu_description"];
cell.detailTextLabel.text = categoryItem[@"menu_price"];
return cell;
【讨论】:
看来它会工作。我会试试的,谢谢关注。 在NSDictionary *category = self.categories[section];
行中,出现了问题。错误信息:Expected method to read array element not found on object of type 'NSSet *'
有 3 个错误。
@MelihMucuk 我已经验证了上面的代码,它工作正常。能否提供self.categories的NSLog?
@MelihMucuk 我在原始答案中包含了源代码我创建了一个包含您提供的值的 json 文件,然后重新格式化了 json 以显示在 tableView 中。
我会在星期二尝试并报告结果。感谢您的努力。【参考方案2】:
您还可以使用免费的 Sensible TableView 框架从 Web 服务获取数据并自动将其显示在您的表格视图中。
【讨论】:
以上是关于访问 NSMutableArray 对象以在 TableView 上使用的主要内容,如果未能解决你的问题,请参考以下文章
从数组数组中选择一个数组以在uitableview(iphone)中显示
如何将 NSmutablearray 放入 NSString [关闭]
无法访问 SqlTransaction 对象以在 catch 块中回滚