2016-12-04 5 views
0

У меня есть вложенные данные (NSDictionary), которые я получаю с сервера. Я заполняю свое представление таблицы только первым уровнем данных. Теперь мне нужно открыть определенные вложенные данные, нажав на определенную ячейку. Вот пример данных:Отобразить представление таблицы с вложенными данными в объекте c

treeItem =  (
       { 
      name = "smth"; 
      items = { 
       treeItem = { 
        name = "smth"; 
        items = { 
         treeItem = { 
          name = "smth"; 
          items = {} 
          }; 
         }, 

         treeItem = { 
          name = "smth"; 
          items = {} 
          }; 
         }; 
        }; 
       }, 
       treeItem = { 
        name = "smth"; 
        items = { 
         treeItem = { 
          name = "smth"; 
          items = {} 
          }; 
         }; 
        }; 
       } 
      }; 
     }) 

Как видите, вложенные данные (элементы) могут быть разными и не иметь ограничений. Я заполнил ячейки представления таблицы значением ключа «name». Каждый «элемент» состоит из «treeItem», и каждый из них имеет собственное «имя». Мне нужно заполнить ячейки «именем» из моего NSDictionary. Если «items» пуст, он просто ничего не делает. Вот мой код "MainTableViewController.m":

#import "MainTableViewController.h" 
#import "XMLDictionary.h" 
#import "SearchResultsViewController.h" 

@interface MainTableViewController() <UISearchResultsUpdating> 
@property (strong, nonatomic) NSMutableArray *data; 
@property (strong, nonatomic) UISearchController *controller; 
@property (strong, nonatomic) NSArray *results; 
@end 

@implementation MainTableViewController 
{ 
    NSDictionary *xmlDoc; 
    NSDictionary *name; 

} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    [self WebServiceSyncCall]; 

    SearchResultsViewController *searchResults = (SearchResultsViewController *)self.controller.searchResultsController; 
    [self addObserver:searchResults forKeyPath:@"results" options:NSKeyValueObservingOptionNew context:nil]; 

} 

- (void) WebServiceSyncCall{ 
    //Response data object 
    NSData *returnData = [[NSData alloc]init]; 

    //Build the Request 
    NSString *param = @"params"; 

    NSString *postString = [NSString stringWithFormat:@"request=%@",param]; 

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"url"]]; 

    [request setHTTPMethod:@"POST"]; 
    [request setValue:[NSString stringWithFormat:@"%lu", (unsigned long)[postString length]] forHTTPHeaderField:@"Content-length"]; 
    [request setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]]; 

    //Send the Request 
    returnData = [NSURLConnection sendSynchronousRequest: request returningResponse: nil error: nil]; 

    bool debug = YES; 

    xmlDoc = [NSDictionary dictionaryWithXMLData:returnData]; 

    name = [xmlDoc valueForKeyPath:@"TreeItem.name"]; 

    if (debug && returnData) { 

     //   NSLog(@"Response >>>> %@", name); 
    } 

} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (NSMutableArray *)data { 
    if (!_data){ 
     _data = [[NSMutableArray alloc]init]; 
     _data=[name mutableCopy]; 
    } 
    return _data; 
} 

- (UISearchController *)controller{ 
    if(!_controller){ 
     UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 
     SearchResultsViewController *resultsController = [storyboard instantiateViewControllerWithIdentifier:@"SearchResults"]; 

     _controller = [[UISearchController alloc]initWithSearchResultsController:resultsController]; 
     _controller.searchResultsUpdater = self; 
    } 

    return _controller; 
} 


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return self.data.count; 
} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 

    // Configure the cell... 
    cell.textLabel.text = [self.data objectAtIndex:indexPath.row]; 
    return cell; 
} 

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 

} 

#pragma - Search Results Updater 

-(void)updateSearchResultsForSearchController:(UISearchController *)searchController{ 

    self.results = nil; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains [cd] %@", self.controller.searchBar.text]; 
    self.results = [self.data filteredArrayUsingPredicate:predicate]; 
} 

- (IBAction)searchButtonPressed:(id)sender { 

    [self presentViewController:self.controller animated:YES completion:nil]; 

} 


@end 

Что я могу сделать? Любые советы, идеи или советы.

+0

Посмотрите на RATreeView https://github.com/Augustyniak/RATreeView – Frankie

ответ

0

Идея проложить просто, просто проверьте, какие данные возвращаются каждой клавишей. Если это массив, значит, есть массив словаря. И если это словарь, то продолжайте читать значения.