2016-07-25 5 views
1

Как рассчитать количество строк для каждого раздела и заполнить его данные. Ниже приведены данные.Динамические строки для каждого раздела

<__NSCFArray 0x7fadb3e73a60>(
    { 
     AMID = ""; 
     AMName = "xyz"; 
     records =  (
        { 
       EId = 100; 
       EMName = "abc"; 
       EName = "Ename1"; 
      } 
     ); 
     EGroupId = 001; 
     EGroupName = "SectionName1"; 
     stat = G; 
    }, 

    { 
     AMID = ""; 
     AMName = "zyx"; 
     records =  (
        { 
       EId = 144; 
       EMName = "namename"; 
       EName = "somestring"; 
      }, 
        { 
       EId = 159; 
       EMName = "somestring"; 
       EName = "somestring"; 
      }, 
        { 
       EId = 161; 
       EMName = "somestring"; 
       EName = "somestring"; 
      } 

    ); 
      EGroupId = 86; 
      EGroupName = "SectionName2"; 
      stat = Y; 
     } 
) 

Из приведенных выше данных, я хочу «EGroupName» значение в секциях и динамически рассчитывать numberofrowsinsection для каждого раздела (в данном случае это «SectionName1 и SectionName2). Конечный результат должен быть как,

**SectionName1** 
    return 1; 
**SectionName2** 
    return 3; 

действительно ценю вашу помощь.

Edited

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

    NSString *selectedEngagementGroupId = engagementGroupDataArray[indexPath.section][@"EngagementGroupId"]; 
    NSString *selectedEngagementId = modelItem[@"EId"]; 
    NSLog(@"EGId %@",selectedEngagementGroupId); 
    NSLog(@"EId %@",selectedEngagementId); 

} 

ответ

2

Массив, после преобразования в объекты будет массив словарей, где каждый словарь содержит массив, и каждая из них содержит строковое значение, может использоваться как имя раздела. Это идеальный источник данных для многосекторного представления таблицы.

После разбора JSON, вы будете иметь объективную коллекцию с, называют его:

NSArray *parsedObject; 

Количество секций:

parsedObject.count; 

Название секции на indexPath является :

parsedObject[indexPath.section][@"EGroupName"] 

количество строк в разделе:

NSArray *sectionArray = parsedObject[section][@"records"]; 
[sectionArray count] 

Модель элемент в данной indexPath является:

NSArray *sectionArray = parsedObject[indexPath.section][@"records"]; 
sectionArray[indexPath.row]; 

EDIT пойти немного глубже, сама секция массива представляет собой массив из словарей, так что ...

NSArray *sectionArray = parsedObject[indexPath.section][@"records"]; 
NSDictionary *modelItem = sectionArray[indexPath.row]; 

NSNumber *itemId = modelItem[@"EId"]; 
NSNumber *itemEMName = modelItem[@"EMName"]; 
NSNumber *itemName = modelItem[@"EName"]; 

// if the table cell is a just a vanilla UITableViewCell... 
cell.textLabel.text = itemName; 
cell.detailTextLabel.text = itemEMName; 

EDIT AGAIN Помните, что весь ваш код источника данных должен следовать этому шаблону, чтобы получить атрибуты уровня раздела из данных ...

NSString *engagementGroupString = engagementGroupDataArray[section][@"EGroupName"]; 
NSString *engagementManagerString = engagementGroupDataArray[section][@"AMName"]; 

EDIT СНОВА, СНОВА Вы можете найти его утомительно вводить все эти вещи, чтобы получить модель предмета каждый раз, когда это необходимо. Если да, то вы можете сжать вещи путем создания вспомогательной функции, как:

- (NSDictionary *)modelItemForIndexPath:(NSIndexPath *):indexPath { 
    NSArray *sectionArray = parsedObject[indexPath.section][@"records"]; 
    return sectionArray[indexPath.row]; 
} 

Сейчас, например, когда пользователь выбирает что-то:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSString *selectedEngagementGroupId = engagementGroupDataArray[indexPath.section][@"EngagementGroupId"]; 
    NSDictionary *modelItem = [self modelItemForIndexPath:indexPath]; 
    NSString *selectedEngagementId = modelItem[@"EId"]; 
    NSLog(@"EGId %@",selectedEngagementGroupId); 
    NSLog(@"EId %@",selectedEngagementId); 
} 
+0

Я получаю правильное количество строк для каждого раздела. Как отобразить «EName» как заголовок и «EMName», как указано для каждой строки? – user3310076

+0

@ user3310076 - из данных в OP видно, что массив записей представляет собой массив словарей, см. Edit для того, как их обрабатывать. – danh

+0

приложение рушится, прокручивая стол. Завершение приложения из-за неперехваченного исключения «NSRangeException», причина: '- [__ NSCFArray objectAtIndex:]: index (11) за пределами (11). Я отправлю свой код в поле ответа. Пожалуйста, дайте мне знать, что я делаю неправильно. – user3310076

1

Я предполагаю, что вы знаете, как преобразовать что JSON в коллекцию Objective-C (вы получите объект массива верхнего уровня я думать, но не показывают объект верхнего уровня, который недействителен JSON).

Чтобы сохранить ваши данные, необходимо создать свойство NSMutableDictionary, а ключ будет именем раздела, а значения будут связаны с массивом records.

@property NSMutableDictionary *_sections; 

Однако одна сложность заключается в том, что словари не поддерживают заказ и заказ очень важно с UITableView, так что вы должны держать заказ в отдельном массиве:

@property NSMutableArray *_sectionNames; 

Выделяют их в бит кода, который декодирует JSON, а затем хранит в них данные:

NSArray *arrayFromJson = ...; 
for (NSDictionary *dict in arrayFromJson) { 
    NSString *sectionName = dict[@"EGroupName"]; 
    [_sections setObject:dict[@"records"] forKey:sectionName]; 
    [_sectionNames addObject:sectionName]; 
} 

Если вы хотите отсортировать разделы в алфавитном порядке, например, просто просто выберите _sectionNames, как вам нравится (упражнение для читателя).

И тогда UITableDataSource методы будут что-то вроде этого:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return [_sectionNames count]; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    NSString *sectioName = _sectionNames[section]; 
    return [_sections[sectionName] count]; 
} 
+0

Спасибо. Тем не менее, я получаю «нет видимого @interface для nsmutabledictionary объявляет ошибку selector addObject». и я обновил фактические данные, полученные от webservice – user3310076

+0

@danh Спасибо; исправленный. – Droppy

+0

@ user3310076 У меня было неправильное имя метода. – Droppy

Смежные вопросы