访问要在TableView上使用的NSMutableArray对象

时间:2013-03-22 13:38:43

标签: ios objective-c uitableview nsmutablearray nsdictionary

我开始开发一个使用带有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 Pizzas

  • 土耳其披萨26 TL
  • Italiano Pizza 27 TL
  • Extravaganza Pizza 29 TL
  • Pepperoni Pizza 28 TL

-S Pizzas

  • 土耳其披萨12 TL
  • Italiano Pizza 13 TL
  • Extravaganza Pizza 15 TL
  • Pepperoni Pizza 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;
}

2 个答案:

答案 0 :(得分:4)

如果您的内容是静态的,可以尝试使用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的数据源以获取新结构

#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;
}

答案 1 :(得分:0)

您还可以使用免费的Sensible TableView框架从Web服务获取数据并自动在表视图中显示它。