包含UITableView中所有级别上的项目的多级别类别

我必须使用下面的JSON响应(Array)创build一个UITableView 。 我还没有代码,但是会喜欢一些方向,我将如何拆分这个数组,以适应各级别的类别和项目。

  { "result":{ "products":[ { "id":"4", "product_code":"PR04", "title":"Product1", "franchisee_id":"118" } ], "categories":[ { "id":"8", "name":"Category1" }, { "id":"20", "name":"Category2", "products":[ { "id":"9", "product_code":"PR07", "title":Product2, "franchisee_id":"118" } ] } ] } } 

我想要达到以下结果:

  • 项目
  • 类别1>项目
  • 类别2>项目

当一个类别被点击时,它将滑动到该类别的产品。 真的会喜欢这方面的一些方向。 有些产品不会分类。 就像上面的例子。

好….

  1. 你需要parsingJSON文件。 你可以很容易地谷歌一些教程,但这里是一个体面的 。

  2. 接下来,您将需要设置一个UITableView来加载项目。 另一个关于UITableView的好教程

  3. 那么你将需要学习如何在UIViewController之间传递数据。 教程 。

所以你在代码中的步骤是:

  1. parsingJSON以分离所有元素。
  2. 设置一个UITableView来显示顶层元素。
  3. 创build第二个UITableViewController ,在顶层项目被选定后推送到。
  4. 为第二个UITableViewController设置一个自定义初始值设定项,以便您可以从parsingJSON的第一个视图控制器传递相关数据。

我假设你正在寻找一堆关于如何做到这一点的代码,但这是没有意义的:)

如果遇到任何麻烦,请告诉我,我很乐意帮忙。

编辑:

我知道我说我不打算转储代码,但我有一些额外的时间。

创build一个名为ProductObjectNSObject子类并使.h看起来像这样:

 #import <Foundation/Foundation.h> @interface ProductObject : NSObject @property NSString *productCode, *productTitle, *franchiseId, *productId; @end 

不要对.m做任何事情


创build另一个名为CategoryObject NSObjectCategoryObject ,并使.h如下所示:

 #import <Foundation/Foundation.h> @interface CategoryObject : NSObject @property NSString *categoryName, *categoryId; @property NSArray *products; @end 

再次,不需要对.m做任何事情。


现在,在你想要显示UITableView的产品和类别(这是所有的.m.h是空的)类:

 #import "ViewController.h" #import "CategoryObject.h" #import "ProductObject.h" @interface ViewController () //Hooked in from IB @property (weak, nonatomic) IBOutlet UITableView *table; //Our UITableView data source @property NSMutableDictionary *tableObjects; @end @implementation ViewController /** Parses a the local JSON file */ - (void)parseJSON { NSString *filePath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"json"]; //création d'un string avec le contenu du JSON NSString *myJSON = [[NSString alloc] initWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:NULL]; NSError *error; NSDictionary *topLevleJSON = [NSJSONSerialization JSONObjectWithData:[myJSON dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:&error]; if (error) { NSLog(@"Error serializing JSON: %@", error.localizedDescription); return; } NSArray *products = topLevleJSON[@"products"]; NSArray *categories = topLevleJSON[@"categories"]; //Use a NSDictonary so that it contains an NSArray of ProductObjects for the "Products" key, and an array of CategoryObjects for the "Category" key. self.tableObjects = [NSMutableDictionary new]; //Parse all the products NSMutableArray *productsInJSON = [NSMutableArray new]; [products enumerateObjectsUsingBlock:^(NSDictionary *productObject, NSUInteger idx, BOOL *stop) { ProductObject *product = [self createProductObjectFromDictionary:productObject]; [productsInJSON addObject:product]; }]; //Set the array of ProductObjects for the key @"Products" [self.tableObjects setObject:productsInJSON forKey:@"Products"]; //Parse all the categories NSMutableArray *categoriesInJSON = [NSMutableArray new]; [categories enumerateObjectsUsingBlock:^(NSDictionary *categoryObject, NSUInteger idx, BOOL *stop) { CategoryObject *category = [self createCategoryObjectFromDictionary:categoryObject]; [categoriesInJSON addObject:category]; }]; //Set the array of CategoryObjects for key @"Categories" [self.tableObjects setObject:categoriesInJSON forKey:@"Categories"]; [self.table reloadData]; } /** Creates a ProductObject from an NSDictonary. @param dictionary The dictonary describing the Product parsed from JSON @return A pretty formatted ProductObject */ - (ProductObject*)createProductObjectFromDictionary:(NSDictionary*)dictionary { ProductObject *product = [ProductObject new]; product.productTitle = dictionary[@"title"]; product.productCode = dictionary[@"product_code"]; product.franchiseId = dictionary[@"franchisee_id"]; product.productId = dictionary[@"id"]; return product; } /** Creates a Category from an NSDictionary @param dictionary The dictonary describing the Category parsed from JSON @return A pretty formatted CategoryObject */ - (CategoryObject*)createCategoryObjectFromDictionary:(NSDictionary*)dictionary { CategoryObject *category = [CategoryObject new]; category.categoryId = dictionary[@"id"]; category.categoryName = dictionary[@"name"]; //Check to see if the "products" key exist for the category, if we don't check and just look for it, we will get a crash if it doesn't exist. if ([[dictionary allKeys] containsObject:@"products"]) { NSArray *categoryProducts = dictionary[@"products"]; //Parse all the Products for the Category. NSMutableArray *categoryProductsFormatted = [NSMutableArray new]; [categoryProducts enumerateObjectsUsingBlock:^(NSDictionary *productObject, NSUInteger idx, BOOL *stop) { ProductObject *product = [self createProductObjectFromDictionary:productObject]; [categoryProductsFormatted addObject:product]; }]; category.products = [NSArray arrayWithArray:categoryProductsFormatted]; } else { category.products = nil; } return category; } #pragma mark - #pragma mark - UITableView delegate - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return [[self.tableObjects allKeys] count]; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { //Get the key for this section NSString *key = [[self.tableObjects allKeys] objectAtIndex:section]; //Return the number of objects for this key. return [(NSArray*)[self.tableObjects objectForKey:key] count]; } - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { return [[self.tableObjects allKeys] objectAtIndex:section]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CellIdentifier"]; if (!cell) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellIdentifier"]; } //Get all the NSArray associated with this section, which will be an array of ProductObjects or an array of CategoryObjects NSString *key = [[self.tableObjects allKeys] objectAtIndex:indexPath.section]; NSArray *sectionobjects = (NSArray*)[self.tableObjects objectForKey:key]; id object = [sectionobjects objectAtIndex:indexPath.row]; //Set the cell text based on what kind of object is returned if ([object isKindOfClass:[ProductObject class]]) { cell.textLabel.text = [(ProductObject*)object productTitle]; } else if ([object isKindOfClass:[CategoryObject class]]) { cell.textLabel.text = [(CategoryObject*)object categoryName]; } return cell; } #pragma mark - #pragma mark - UITableView delegate - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:YES]; NSString *key = [[self.tableObjects allKeys] objectAtIndex:indexPath.section]; NSArray *sectionobjects = (NSArray*)[self.tableObjects objectForKey:key]; id object = [sectionobjects objectAtIndex:indexPath.row]; //They selected a product if ([object isKindOfClass:[ProductObject class]]) { ProductObject *product = (ProductObject*)object; NSLog(@"%@", product.productTitle); NSLog(@"%@", product.productCode); NSLog(@"%@", product.productId); } //They selected a Category else if ([object isKindOfClass:[CategoryObject class]]) { //Check to see if the CategoryObject has any ProductObjects associated with it if ([(CategoryObject*)object products]) { //Now you will need to pass array of ProductObjects this along to your next view controller. NSArray *cateogryProducts = [(CategoryObject*)object products]; //For demonstration purposes, i'll run through and print out all the Products for this Category [cateogryProducts enumerateObjectsUsingBlock:^(ProductObject *product, NSUInteger idx, BOOL *stop) { NSLog(@"%@", product.productTitle); NSLog(@"%@", product.productCode); NSLog(@"%@", product.productId); }]; } } } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //Start parsing the JSON [self parseJSON]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end 

编辑:

如果您想要像手风琴一样打开和closures桌子的一部分,请查看Apple的相同代码: 表格视图animation和手势 。