I am trying to draw data in a table view tree, creating a separate list for each node. enter image description here

{ "ID": "0", "Name": "Все", "Departments": [ { "ID": "88", "Name": "IT офис", "Employees": [ { "ID": "888", "Name": "Иванов Иван Иванович", "Title": "Менеджер по проектам", "Email": "test@yandex.ru", "Phone": "+79991112222" }, { "ID": "79358", "Name": "Иванов Иван Иванович", "Title": "Менеджер по проектам", "Email": "test@yandex.ru", "Phone": "+79991112222" }, { "ID": "46488", "Name": "Иванов Иван Иванович", "Title": "Руководитель проектов", "Email": "test@yandex.ru", "Phone": "+79991112222" } ] }, { "ID": "989", "Name": "Авиа", "Departments": [ { "ID": "3058", "Name": "Отдел 1", "Employees": [ { "ID": "88388", "Name": "Иванов Иван Иванович", "Title": "Авиационный техник авиационного и радиоэлектронного оборудования", "Phone": "+79991112222" }, { "ID": "39806", "Name": "Иванов Иван Иванович", "Title": "Авиационный техник ГСМ", "Phone": "+79991112222" }, { "ID": "2553", "Name": "Иванов Иван Иванович", "Title": "Автомеханик", "Phone": "+79991112222" }, { "ID": "8981", "Name": "Иванов Иван Иванович", "Title": "Инженер летательных аппаратов и двигателей", "Phone": "+79991112222" }, { "ID": "4527", "Name": "Иванов Иван Иванович", "Title": "Инженер", "Email": "test@yandex.ru", "Phone": "+79991112222" }, { "ID": "3460", "Name": "Иванов Иван Иванович", "Title": "Инженер по сертификации", "Phone": "+79991112222" }, { "ID": "3992", "Name": "Иванов Иван Иванович", "Title": "Авиационный техник", "Phone": "+79991112222" }, { "ID": "7635", "Name": "Иванов Иван Иванович", "Title": "Авиационный техник летательных аппаратов и двигателей", "Phone": "+79991112222" }, { "ID": "3918", "Name": "Иванов Иван Иванович", "Title": "Главный инженер", "Phone": "+79991112222" }, { "ID": "3991", "Name": "Иванов Иван Иванович", "Title": "Инженер авиационного и радиоэлектронного оборудования", "Phone": "+79991112222" }, { "ID": "4013", "Name": "Иванов Иван Иванович", "Title": "Авиационный техник авиационного и радиоэлектронного оборудования", "Phone": "+79991112222" } ] }, { "ID": "306", "Name": "Отдел 2", "Employees": [ { "ID": "5101", "Name": "Иванов Иван Иванович", "Title": "Механик", "Email": "test@yandex.ru", "Phone": "+79991112222" }, { "ID": "8063", "Name": "Иванов Иван Иванович", "Title": "Менеджер по работе с клиентами", "Email": "test@yandex.ru", "Phone": "+79991112222" }, { "ID": "1944", "Name": "Иванов Иван Иванович", "Title": "Заместитель директора по летной работе", "Email": "test@yandex.ru", "Phone": "+79991112222" }, { "ID": "2820", "Name": "Иванов Иван Иванович", "Title": "Экономист", "Email": "test@yandex.ru", "Phone": "+79991112222" }, { "ID": "1910", "Name": "Иванов Иван Иванович", "Title": "Заместитель директора по общим вопросам", "Email": "test@yandex.ru", "Phone": "+79991112222" }, { "ID": "2652", "Name": "Иванов Иван Иванович", "Title": "Командир парашютного звена", "Email": "test@yandex.ru", "Phone": "+79991112222" }, { "ID": "4175", "Name": "Иванов Иван Иванович", "Title": "Директор", "Email": "test@yandex.ru", "Phone": "+79991112222" }, { "ID": "2752", "Name": "Иванов Иван Иванович", "Title": "Начальник штаба", "Email": "test@yandex.ru", "Phone": "+79991112222" }, { "ID": "2766", "Name": "Иванов Иван Иванович", "Title": "Бухгалтер", "Email": "test@yandex.ru", "Phone": "+79991112222" }, { "ID": "2827", "Name": "Иванов Иван Иванович", "Title": "Директор", "Email": "test@yandex.ru", "Phone": "+79991112222" }, { "ID": "7155", "Name": "Иванов Иван Иванович", "Title": "Начальник штаба", "Email": "test@yandex.ru", "Phone": "+79991112222" }, { "ID": "3459", "Name": "Иванов Иван Иванович", "Title": "Начальник инженерно-авиационной службы", "Phone": "+79991112222" }, { "ID": "2950", "Name": "Иванов Иван Иванович", "Title": "Комендант", "Email": "test@yandex.ru", "Phone": "+79991112222" }, { "ID": "4645", "Name": "Иванов Иван Иванович", "Title": "Инженер ИАС", "Email": "test@yandex.ru", "Phone": "+79991112222" } ] }, { "ID": "308", "Name": "Отдел 3", "Departments": [ { "ID": "309", "Name": "Подотдел 1", "Employees": [ { "ID": "8309", "Name": "Иванов Иван Иванович", "Title": "Водитель", "Phone": "+79991112222" } ] }, { "ID": "310", "Name": "Подотдел 2", "Employees": [ { "ID": "6137", "Name": "Иванов Иван Иванович", "Title": "Авиационный техник", "Phone": "+79991112222" }, { "ID": "7225", "Name": "Иванов Иван Иванович", "Title": "Авиационный техник летательных аппаратов и двигателей", "Phone": "+79991112222" } ] }, { "ID": "311", "Name": "Подотдел 3", "Employees": [ { "ID": "3840", "Name": "Иванов Иван Иванович", "Title": "Пилот", "Email": "test@yandex.ru", "Phone": "+79991112222" }, { "ID": "4091", "Name": "Иванов Иван Иванович", "Title": "Пилот", "Email": "test@yandex.ru", "Phone": "+79991112222" }, { "ID": "2813", "Name": "Иванов Иван Иванович", "Title": "Врач", "Email": "test@yandex.ru", "Phone": "+79991112222" }, { "ID": "2869", "Name": "Иванов Иван Иванович", "Title": "Пилот", "Email": "test@yandex.ru", "Phone": "+79991112222" }, { "ID": "2654", "Name": "Иванов Иван Иванович", "Title": "Летчик-методист", "Email": "test@yandex.ru", "Phone": "+79991112222" }, { "ID": "6999", "Name": "Иванов Иван Иванович", "Title": "Пилот", "Email": "test@yandex.ru", "Phone": "+79991112222" }, { "ID": "4178", "Name": "Иванов Иван Иванович", "Title": "Пилот-инструктор", "Phone": "+79991112222" }, { "ID": "2868", "Name": "Иванов Иван Иванович", "Title": "Пилот", "Email": "test@yandex.ru", "Phone": "+79991112222" }, { "ID": "3915", "Name": "Иванов Иван Иванович", "Title": "Пилот", "Phone": "+79991112222" } ] }, { "ID": "312", "Name": "Подотдел 4", "Employees": [ { "ID": "8272", "Name": "Иванов Иван Иванович", "Title": "Водитель", "Phone": "+79991112222" }, { "ID": "4047", "Name": "Иванов Иван Иванович", "Title": "Сторож", "Phone": "+79991112222" }, { "ID": "2816", "Name": "Иванов Иван Иванович", "Title": "Сторож", "Phone": "+79991112222" }, { "ID": "6037", "Name": "Иванов Иван Иванович", "Title": "Разнорабочий", "Phone": "+79991112222" }, { "ID": "5805", "Name": "Иванов Иван Иванович", "Title": "Повар", "Phone": "+79991112222" }, { "ID": "4048", "Name": "Иванов Иван Иванович", "Title": "Сторож", "Phone": "+79991112222" }, { "ID": "8573", "Name": "Иванов Иван Иванович", "Title": "Сторож" }, { "ID": "11172", "Name": "Иванов Иван Иванович", "Title": "Водитель", "Phone": "+79991112222" }, { "ID": "3852", "Name": "Иванов Иван Иванович", "Title": "Разнорабочий", "Phone": "+79991112222" }, { "ID": "7680", "Name": "Иванов Иван Иванович", "Title": "Повар" }, { "ID": "5452", "Name": "Иванов Иван Иванович", "Title": "Сторож", "Phone": "+79991112222" }, { "ID": "3019", "Name": "Иванов Иван Иванович", "Title": "Разнорабочий", "Phone": "+79991112222" }, { "ID": "3483", "Name": "Иванов Иван Иванович", "Title": "Сторож", "Phone": "+79991112222" }, { "ID": "7684", "Name": "Иванов Иван Иванович", "Title": "Кладовщик", "Phone": "+79991112222" } ] }, { "ID": "313", "Name": "Подотдел 5", "Employees": [ { "ID": "2655", "Name": "Иванов Иван Иванович", "Title": "Парашютист-инструктор", "Email": "test@yandex.ru", "Phone": "+79991112222" }, { "ID": "6252", "Name": "Иванов Иван Иванович", "Title": "Парашютист-инструктор", "Phone": "+79991112222" }, { "ID": "2817", "Name": "Иванов Иван Иванович", "Title": "Уборщица", "Phone": "+79991112222" }, { "ID": "6253", "Name": "Иванов Иван Иванович", "Title": "Парашютист-инструктор", "Phone": "+79991112222" }, { "ID": "2653", "Name": "Иванов Иван Иванович", "Title": "Парашютист-инструктор", "Email": "test@yandex.ru", "Phone": "+79991112222" }, { "ID": "3672", "Name": "Иванов Иван Иванович", "Title": "мастер по ремонту парашютно-десантной техники", "Email": "test@yandex.ru", "Phone": "+79991112222" } ] } ] }, { "ID": "314", "Name": "Отдел 4", "Employees": [ { "ID": "8780", "Name": "Иванов Иван Иванович", "Title": "Старший инструктор парашютно-десантной подготовки" }, { "ID": "8947", "Name": "Иванов Иван Иванович", "Title": "Заведующий складом" }, { "ID": "8793", "Name": "Иванов Иван Иванович", "Title": "Инструктор парашютно-десантной подготовки" }, { "ID": "8766", "Name": "Иванов Иван Иванович", "Title": "Начальник штаба" }, { "ID": "9701", "Name": "Иванов Иван Иванович", "Title": "Бухгалтер", "Email": "test@yandex.ru", "Phone": "+79991112222" }, { "ID": "8767", "Name": "Иванов Иван Иванович", "Title": "Инструктор парашютно-десантной подготовки" }, { "ID": "8786", "Name": "Иванов Иван Иванович", "Title": "Комендант аэродрома" }, { "ID": "8784", "Name": "Иванов Иван Иванович", "Title": "Инструктор парашютно-десантной подготовки" }, { "ID": "9301", "Name": "Иванов Иван Иванович", "Title": "Уборщица" }, { "ID": "8775", "Name": "Иванов Иван Иванович", "Title": "Инженер инженерно-авиационной службы" }, { "ID": "8785", "Name": "Иванов Иван Иванович", "Title": "Техник по радионавигации, радиолокации, связи" }, { "ID": "8774", "Name": "Иванов Иван Иванович", "Title": "Стрелок военизированной охраны" }, { "ID": "8768", "Name": "Иванов Иван Иванович", "Title": "Старший стрелок военизированной охраны" }, { "ID": "8948", "Name": "Иванов Иван Иванович", "Title": "Летчик-инструктор" }, { "ID": "8773", "Name": "Иванов Иван Иванович", "Title": "Стрелок военизированной охраны" }, { "ID": "8776", "Name": "Иванов Иван Иванович", "Title": "Командир отряда" } ] }, { "ID": "315", "Name": "Отдел 5", "Employees": [ { "ID": "3458", "Name": "Иванов Иван Иванович", "Title": "Инженер отдела технического контроля", "Phone": "+79991112222" }, { "ID": "5901", "Name": "Иванов Иван Иванович", "Title": "Заместитель директора по авиационной безопасности", "Phone": "+79991112222" }, { "ID": "5811", "Name": "Иванов Иван Иванович", "Title": "инженер-инспектор по безопасности полетов", "Email": "test@yandex.ru", "Phone": "+79991112222" } ] } ] }, { "ID": "328", "Name": "Тест 1" }, { "ID": "254", "Name": "გამოძახება" }, { "ID": "35", "Name": "Тест 3", "Employees": [ { "ID": "4650", "Name": "Иванов Иван Иванович", "Title": "Руководитель офиса", "Email": "test@yandex.ru", "Phone": "+79991112222" }, { "ID": "4651", "Name": "Иванов Иван Иванович", "Title": "Менеджер по работе с клиентами", "Email": "test@yandex.ru", "Phone": "+79991112222" }, { "ID": "9215", "Name": "Иванов Иван Иванович", "Title": "Менеджер по работе с клиентами", "Email": "test@yandex.ru", "Phone": "+79991112222" }, { "ID": "7079", "Name": "Иванов Иван Иванович", "Title": "Менеджер по работе с клиентами", "Email": "test@yandex.ru", "Phone": "+79991112222" }, { "ID": "10217", "Name": "Иванов Иван Иванович", "Title": "Менеджер по работе с клиентами", "Email": "test@yandex.ru", "Phone": "+79991112222" }, { "ID": "4652", "Name": "Иванов Иван Иванович", "Title": "Менеджер по работе с клиентами", "Email": "test@yandex.ru", "Phone": "+79991112222" } ] }, { "ID": "716", "Name": "გამოძახება" } ] } 

The first list that is shown in the screenshot was created as follows:

  NSDictionary *responseDic = [NSJSONSerialization JSONObjectWithData:receivedData options:NSJSONReadingMutableContainers error:nil]; if ([NSJSONSerialization isValidJSONObject:responseDic]) { NSArray *array = responseDic[@"Departments"]; _tempDepart = [NSMutableArray new]; [array enumerateObjectsUsingBlock:^(NSDictionary *obj, NSUInteger idx, BOOL *stop) { [_tempDepart addObject:obj]; }]; } 

But to create lists further, difficulties arose :( When I click on a cell, I update the TableView data, and in the updated one I should show the sub-elements of a specific cell. Here is my attempt, but for NSDictionary I cannot turn on the index to search for sub-elements of a specific element:

 - (void) tableView: (UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *) indexPath { // Нажатие по ячейки _levelIndex++; // как глубого прошли внутрь [_rememberStory addObject:[_tempDepart[indexPath.row] objectForKey:@"Name"]]; // создание истории, по которым шли вглубь NSDictionary *responseDic = [NSJSONSerialization JSONObjectWithData:receivedData options:NSJSONReadingMutableContainers error:nil]; NSArray *departments = responseDic[@"Departments"]; // создание списка 2 уровня if ([NSJSONSerialization isValidJSONObject:responseDic]) { NSArray *array = [departments objectAtIndex:indexPath.row]; // для NSDictionary нельзя обратится по индексу NSLog(@"array:%@", array); NSLog(@"array count:%lu", (unsigned long)array.count); _tempDepart = [NSMutableArray new]; [_tempDepart removeAllObjects]; [array enumerateObjectsUsingBlock:^(NSDictionary *obj, NSUInteger idx, BOOL *stop) { // падает программа [_tempDepart addObject:obj]; }]; } ViewControllerTable *detail = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewControllerTable"]; detail.tempDepart = _tempDepart; detail.tableViewData = _tableViewData; detail.rememberStory = _rememberStory; [self presentViewController:detail animated:YES completion:nil]; } 

Announcement in .h

  @property (strong, nonatomic) NSMutableArray *tempDepart; 

As for the cycle, as I understand it, you cannot refer to the element:

 NSArray *testArray = array[0]; // программа падает 

enter image description here

  • one
    Not quite understand the logic, why the first time you create an array, and the second time the dictionary? Create an array again for the second time - Vitali Eller
  • @VitaliEller Made a change, the program crashes in a loop. An array is passed to the loop, which has three elements of employees (shown in the screenshot) [array enumerateObjectsUsingBlock: ^ (NSDictionary * obj tried to replace obj with NSArray, the program also falls in this loop, not reaching the addition of elements - StriBog
  • What is the error with crash? - Vitali Eller
  • @VitaliEller cannot address by index - StriBog
  • It seems that you have more cells than elements in the array, how many cells do you have in the table? - Vitali Eller

1 answer 1

Your @ "Departments" field] contains an array, and you try to take it as a dictionary.

Fix this NSDictionary *zeroResponeDic = responseDic[@"Departments"]; // создание списка 2 уровня NSDictionary *zeroResponeDic = responseDic[@"Departments"]; // создание списка 2 уровня for this NSArray *departments = responseDic[@"Departments"]; // создание списка 2 уровня NSArray *departments = responseDic[@"Departments"]; // создание списка 2 уровня

Each department is a dictionary. You can contact:

 NSDictionary *department = departments[ indexpath.row ]; 

NSLog( @"name %@", department["Name"]);

PS: on the site http://json.parser.online.fr/ the structure of the json is very clearly visible

  • From such a dictionary I can in the future take the next "dictionary"? In other words, NSLog (@ "name% @", department ["Name"]); contains the name of the offices, and among these offices there may be more subsections or employees, Can for example from the department [3] be able to create the next sub dictionary Or maybe I can address the department [3] [0] ps I apologize for stupid questions - StriBog
  • one
    Yes, you can take any field and work with it. Whether it is a subarray, a number, or a dedlorer - Valentine
  • In the loop, the program drops into the loop is transferred to the array, which has three elements of employees (shown in the screenshot) [array enumerateObjectsUsingBlock: ^ (NSDictionary * obj tried to replace obj with NSArray, the program also falls in this loop, not reaching the addition of elements - StriBog
  • Log each object before using it. You've messed up with types somewhere - Valentine
  • one
    You instead of an array caught NSDict. I speak, deduce object, but do not work with it at once. [0] this is work. You in this dictionary need to take the field Emploees, it should be an array. Look at the structure on your own screenshot - Valentin